package com.hehenian.manager.commons;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;
import org.apache.commons.lang3.time.DateFormatUtils;
/**
* 日期操作类
* @author zhouziyang
*
*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static final String[] DATE_PATTERNS = new String[]{"yyyy-MM","yyyyMM","yyyy/MM",
"yyyyMMdd","yyyy-MM-dd","yyyy/MM/dd",
"yyyyMMddHHmmss",
"yyyy-MM-dd HH:mm:ss",
"yyyy/MM/dd HH:mm:ss"};
/**
* yyyy-MM-dd
*/
public static final String DATE_FORMAT = DATE_PATTERNS[4];
/**
* yyyyMMdd
*/
public static final String DATE_FORMAT_2 = DATE_PATTERNS[3];
/**
* yyyy-MM-dd HH:mm:ss
*/
public static final String DATE_TIME_FORMAT = DATE_PATTERNS[7];
/**
* 通过出生日期计算出一个人的年龄
*
* @param date
* @return
*/
public static int getAge(Date memberBirthday) {
if (memberBirthday == null)
return -1;
Calendar birthday = Calendar.getInstance();
birthday.setTimeInMillis(memberBirthday.getTime());
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - birthday.get(Calendar.YEAR);
birthday.add(Calendar.YEAR, age);
if (today.before(birthday)) {
age--;
}
//未满18岁的当18岁
return age<18 ? 18 : age;
}
/**
* 判断两个日期是否为同一天
* @param loginDate
* @param lastLoginDate
* @return
*/
public static boolean isSameDay(Date loginDate,Date lastLoginDate){
DateFormat df = new SimpleDateFormat("yyyyMMdd");
//System.out.println(df.format(loginDate)+","+(df.format(lastLoginDate)));
if(df.format(loginDate).equals(df.format(lastLoginDate))){
return true;
}
return false;
}
/**
* 计算两个日期之间相差的天数
* @param date1
* @param date2
* @return
*/
public static int daysBetween(Date date1,Date date2){
Calendar cal = Calendar.getInstance();
cal.setTime(date1);
long time1 = cal.getTimeInMillis();
cal.setTime(date2);
long time2 = cal.getTimeInMillis();
long between_days=(time1-time2)/(1000*3600*24);
return Integer.parseInt(String.valueOf(between_days));
}
public static boolean is1970(Date date){
DateFormat df = new SimpleDateFormat("yyyyMMdd");
if(df.format(date).equals("19700101")){
return true;
}
return false;
}
/**
* 返回当前时间
*
* @return 返回当前时间
*/
public static Date getCurrentDateTime() {
java.util.Calendar calNow = java.util.Calendar.getInstance();
java.util.Date dtNow = calNow.getTime();
return dtNow;
}
/**
* @return 返回今天日期,时间部分为0。例如:2006-4-8 00:00:00
*/
public static Date getTodayStart() {
return truncate(new Date(), Calendar.DATE);
}
/**
* @return 返回今天日期,时间部分为23:59:59.999。例如:2006-4-19 23:59:59.999
*/
public static Date getTodayEnd() {
return getDayEnd(new Date());
}
/**
* 将字符串转换为日期(不包括时间)
* @param dateString "yyyy-MM-dd"格式的日期字符串
* @return 日期
*/
public static Date getDateFromStr(String dateString) {
try {
return parseDate(dateString,DATE_FORMAT);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 检查字符串是否为日期格式yyyy-MM-dd
* @param dateString
* @return true=是;false=否
*/
public static boolean checkDateString(String dateString) {
return (getDateFromStr(dateString)!=null);
}
/**
* 将字符串转换为日期(包括时间)
* @param dateString "yyyy-MM-dd HH:mm:ss"格式的日期字符串
* @return 日期时间
*/
public static Date getDateTimeFromStr(String dateTimeString) {
try {
return parseDate(dateTimeString,DATE_TIME_FORMAT);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 检查字符串是否为日期时间格式yyyy-MM-dd HH:mm:ss
* @param dateString
* @return true=是;false=否
*/
public static boolean checkDateTimeString(String dateTimeString) {
return (getDateTimeFromStr(dateTimeString)!=null);
}
/**
* 将日期转换为指定的pattern
* @param when
* @param pattern
* @return
*/
public static String formatDate(Date when, String pattern){
return DateFormatUtils.format(when, pattern);
}
/**
* 将日期转换成yyyy-MM-dd格式
* @param when
* @return
*/
public static String formatDate_1(Date when){
return DateFormatUtils.format(when, DATE_FORMAT);
}
/**
* 将日期转换成yyyyMMdd格式
* @param when
* @return
*/
public static String formatDate_2(Date when){
return DateFormatUtils.format(when, DATE_FORMAT_2);
}
/**
* 将日期转换成yyyy-MM-dd HH:mm:ss格式
* @param when
* @return
*/
public static String formatDateTime(Date when){
return DateFormatUtils.format(when, DATE_TIME_FORMAT);
}
/**
* 获取月底的时间
* @param year 年 4位年度
* @param month 月 1~12
* @return 月底的Date对象。例如:2006-3-31 23:59:59.999
*/
public static Date getMonthEnd(int year, int month) {
StringBuffer sb = new StringBuffer(10);
Date date;
if (month<12) {
sb.append(Integer.toString(year));
sb.append("-");
sb.append(month+1);
sb.append("-1");
date = getDateFromStr(sb.toString());
}else{
sb.append(Integer.toString(year+1));
sb.append("-1-1");
date = getDateFromStr(sb.toString());
}
date.setTime(date.getTime() - 1);
return date;
}
/**
* 获取月底
* @param when 要计算月底的日期
* @return 月底的Date对象。例如:2006-3-31 23:59:59.999
*/
public static Date getMonthEnd(Date when) {
//Assert.notNull(when,"date must not be null !");
if(when==null){
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(when);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH)+1;
return getMonthEnd(year,month);
}
/**
* 获取给定日的最后一刻。
* @param when 给定日
* @return 最后一刻。例如:2006-4-19 23:59:59.999
*/
public static Date getDayEnd(Date when) {
Date date = truncate(when,Calendar.DATE);
date = addDays(date,1);
date.setTime(date.getTime() - 1);
return date;
}
/**
* 获取给定日的第0刻。
* @param when 给定日
* @return 第0刻。例如:2006-4-19 00:00:00
*/
public static Date getDay(Date when) {
Date date = truncate(when,Calendar.DATE);
//date = addDays(date,-1);
//date.setTime(date.getTime()+1);
return date;
}
/**
* 日期加法
* @param when 被计算的日期
* @param field the time field. 在Calendar中定义的常数,例如Calendar.DATE
* @param amount 加数
* @return 计算后的日期
*/
public static Date add(Date when, int field, int amount) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(when);
calendar.add(field,amount);
return calendar.getTime();
}
/**
* 计算给定的日期加上给定的天数。
* @param when 给定的日期
* @param amount 给定的天数
* @return 计算后的日期
*/
public static Date addDays(Date when, int amount) {
return add(when,Calendar.DAY_OF_YEAR,amount);
}
/**
* 计算给定的日期加上给定的月数。
* @param when 给定的日期
* @param amount 给定的月数
* @return 计算后的日期
*/
public static Date addMonths(Date when, int amount) {
return add(when,Calendar.MONTH,amount);
}
/**
* 计算给定的日期加上给定的年数。
* @param when 给定的日期
* @param amount 给定的年数
* @return 计算后的日期
*/
public static Date addYears(Date when, int amount) {
return add(when,Calendar.YEAR,amount);
}
/**
* 计算两个日期之间的差
* @param date1
* @param date2
* @return
* date1 - date2
*/
public static int getSeconds(Date date1, Date date2){
if(date1==null || date2==null){
try {
throw new Exception("DateUtils.java --> getSeconds()'s args is null");
} catch (Exception e) {
e.printStackTrace();
}
}
long time1 = date1.getTime();
long time2 = date2.getTime();
return (int) ((time1-time2)/1000);
}
// public static void main(String args[]){
//// Date date1 = getDateTimeFromStr("2014-01-20 21:00:01");
//// Date date2 = getDateTimeFromStr("2014-01-20 20:00:00");
//// System.out.println(getSeconds(date1, date2));
//
// System.out.println(getDayEnd(new Date()));
// }
/**
* @description 判断字符串是否为数字,非0开头
* @param obj
* @return
*/
public static boolean isNumericT(String str){
Pattern pattern = Pattern.compile("[1-9][0-9]*");
return pattern.matcher(str).matches();
}
}