//有些地方需要修改 import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; public class DateUtil {
private final static String[] CN_Digits = { "〇", "一", "二", "三", "四", "五",
"六", "七", "八", "九", "十" };
public static final long daySpan = 24 * 60 * 60 * 1000;
/**yyyy-MM-dd HH:mm:ss*/
public static final String TIME_FORMAT_NORMAL = "yyyy-MM-dd HH:mm:ss";
/**yyyy-MM-dd*/
public static final String DATE_FORMAT_NORMAL = "yyyy-MM-dd";
/**yyyy.MM.dd*/
public static final String DATE_FORMAT_DOT = "yyyy.MM.dd";
/**yyyyMMdd*/
public static final String DATE_FORMAT_NO_MINUS = "yyyyMMdd";
/**yyMMdd*/
public static final String DATE_FORMAT_NO_MINUS_SHORT = "yyMMdd";
/**yyyy-MM*/
public static final String MONTH_FORMAT_NORMAL = "yyyy-MM";
/**MM-dd*/
public static final String MONTH_DAY_FORMAT = "MM-dd";
/**yyyyMMdd*/
public static final String DATE_FORMAT_SHORT = "yyyyMMdd";
/**yyyyMM*/
public static final String MONTH_FORMAT = "yyyyMM";
/**yyyy.MM*/
public static final String MONTH_FORMAT_DOT = "yyyy.MM";
/**yyyyMMddHHmm*/
public static final String DATE_FORMAT_MINUTE = "yyyyMMddHHmm";
/**yyyyMMddHHmmss*/
private static final String TIME_FORMAT_SHORT = "yyyyMMddHHmmss";
/**MM/dd/yyyy HH:mm:ss**/
public static final String MONTH_DAY_YEAR_HOUR_MINUTE ="MM/dd/yyyy HH:mm:ss"; /**
* 判断参数year、month、day能否组成一个合法的日期。
*
* @param month
* 月份,合法月份范围是 1-12
* @param day
* 日数
* @param year
* 年份,必须大于1900
* @return
*/
public static boolean isDate(int month, int day, int year) {
if (year < 1900) {
return false;
}
if (month < 1 || month > 12) {
return false;
}
if (day < 1 || day > 31) {
return false;
} // 判断年份是否为闰年
@SuppressWarnings("unused")
boolean leapYear = isLeapYear(year);
// 获得该年该月的最大日期
int maxD = getMaxDay(year, month);
if (day > maxD) {
return false;
} return true;
} /**
* 给定一个年份和月份,可以得到该月的最大日期。 例如 2009年1月,最大日期为31。
*
* @param year
* 年份,必须大于1900
* @param month
* 月份,合法月份范围是 1-12
* @return
*/
public static int getMaxDay(int year, int month) {
if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
return 30;
}
if (month == 2) {
if (isLeapYear(year)) {
return 29;
} else {
return 28;
}
}
return 31;
} /**
* 判断年份是否为闰年。
*
* @param year
* 年份,必须大于1900
* @return
*/
public static boolean isLeapYear(int year) {
boolean leapYear = ((year % 400) == 0);
if (!leapYear) {
leapYear = ((year % 4) == 0) && ((year % 100) != 0);
}
return leapYear;
} public static String getCurrentStringTime(){
Date date=new Date();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
String formatDate=format.format(date);
return formatDate;
} public static String getCurrentTimeSecond(){
Date date=new Date();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate=format.format(date);
return formatDate;
}
/**
* yyyy-MM-dd HH:mm:ss格式串转换为日期
* @param yyyy-MM-dd HH:mm:ss 格式日期
* @return Date日期
*/
public static Date paseDate(String formatDate){
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=null;
try {
date = format.parse(formatDate);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static String getCurrentTimeMilliSecond(){
Date date=new Date();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String formatDate=format.format(date);
return formatDate;
} public static String getCurrentMonth(){
Date date=new Date();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM");
String formatDate=format.format(date);
return formatDate;
}
/**
* 获取当前日期(格式为20110802)
* @return
*/
public static String getCurrentDay(){
Date date=new Date();
SimpleDateFormat format=new SimpleDateFormat("yyyyMMdd");
String formatDate=format.format(date);
return formatDate;
}
/**
* 获取当前时间
* @param format 时间格式,例如:yyyy-MM-dd
* @param count 增加或减少的天数
* @return
*/
public static String getCurrentDate(String format,Integer count) {
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(format);
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DATE, count);//增加或减少的天数
String currentDate = df.format(cal.getTime());
return currentDate;
} /**
* 增加月份后的日期数
* @param countMoney
* @return
*/
public static String getDateAddMoney(String dateStr, int m) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = df.parse(dateStr);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, m);
return df.format(calendar.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return null;
} /**
* 获取下个月的第一天
* @param time
* @param format
* @return
*/
public static String getNextMonthFirstDay(String format) {
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(format);
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);// 当前月+1,即下个月
cal.set(Calendar.DATE, 1);// 将下个月1号作为日期初始值
String currentMonth = df.format(cal.getTime());
return currentMonth;
} /**
* 获取下个月的最后一天
* @param time
* @param format
* @return
*/
public static String getNextMonthLastDay(String format) {
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(format);
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);// 将下2个月1号作为日期初始值
cal.add(Calendar.MONTH, 2);// 当前月+2,即下2个月
cal.add(Calendar.DATE, -1);// 下2个月1号减去一天,即得到下1一个月最后一天
String currentMonth = df.format(cal.getTime());
return currentMonth;
} public static String format(Date date) {
if(null==date){
return null;
}
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate=format.format(date);
return formatDate;
} public static String format(Date date, String formatStr) {
SimpleDateFormat format = new SimpleDateFormat(formatStr);
String formatDate=format.format(date);
return formatDate;
} public static String format4Null(Date date, String formatStr) { if(date == null) {
return null;
} else { return format(date, formatStr);
}
} /**
* 得到2个字符串日期之间的日期差,返回结果以秒为单位
* @param beginTime
* @param endTime
* @return
* @throws ParseException
*/
public static Long getOffTime(String beginTime, String endTime) {
SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try{
java.util.Date begin = dfs.parse(beginTime);
java.util.Date end = dfs.parse(endTime);
long between = (end.getTime() - begin.getTime()) / 1000;// 除以1000是为了转换成秒
return between;
}catch(Exception e){
e.printStackTrace();
}
return null;
} public static String getYesterday(){
return getCurrentDate("yyyy-MM-dd",-1)+" 00:00:00";
} public static String getToday(){
return getCurrentDate("yyyy-MM-dd",0)+" 00:00:00";
} public static void main(String args[]){
} /**
* 昨天的起始终止
* >=起始 <终止
* @param nowTime
* @return
*/
public static Pair<Long, Long> getLastDay(long nowTime){
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
String s = sdf.format(new Date(nowTime));
Date yesdEnd = sdf.parse(s); return new Pair<Long, Long>(yesdEnd.getTime() - daySpan, yesdEnd.getTime());
}catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* 取得上一个自然周起始(返回最近的周日0点为结束,之前一个周日0点为开始)
* >=起始 <终止
* @param nowTime
* @return
*/
public static Pair<Long, Long> getLastNativeWeek(long nowTime){
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
String s = sdf.format(new Date(nowTime));
Date yesdEnd = sdf.parse(s); // 今天0点 Calendar c = Calendar.getInstance();
c.setTime(yesdEnd);
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
long weekEnd = c.getTimeInMillis();
return new Pair<Long, Long>(weekEnd - daySpan * 7, weekEnd);
}catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* 取得上一个月的起始
* >=起始 <终止
* @param nowTime
* @return
*/
public static Pair<Long, Long> getLastMonth(long nowTime){
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-01 00:00:00");
String s = sdf.format(new Date(nowTime));
Date lmEnd = sdf.parse(s); // 本月1号0点 Calendar c = Calendar.getInstance();
c.setTime(lmEnd);
c.add(Calendar.MONTH, -1); return new Pair<Long, Long>(c.getTimeInMillis(), lmEnd.getTime());
}catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* 计算两个日期之间相差的月数
* @param startDate 开始日期
* @param endDate 结束日期
* @return 两个日期之间相差的月数
*/
public static int dateIntervalMonth(Date startDate, Date endDate) { int intervalMonth = 0;
try {
if(startDate==null || endDate==null){
return intervalMonth;
}
Calendar starCal = Calendar.getInstance();
starCal.setTime(startDate); int sYear = starCal.get(Calendar.YEAR);
int sMonth = starCal.get(Calendar.MONTH); Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
int eYear = endCal.get(Calendar.YEAR);
int eMonth = endCal.get(Calendar.MONTH); intervalMonth = ((eYear - sYear) * 12 + (eMonth - sMonth));
} catch (Exception e) {
intervalMonth = 0;
} return intervalMonth;
} /***
* 根据所选格式将字符串转换为日期类型
* @param dateStr 待转换的字符串
* @param formateRule 转换格式
* @return 日期类型结果
*/
public static Date convertAsDate(String dateStr, String formateRule) {
DateFormat fmt = new SimpleDateFormat(formateRule);
try {
if(dateStr == null) {
return null;
}
return fmt.parse(dateStr);
} catch (ParseException e) {
return null;
}
}
/**
* 自动把String时间转成Date类型
* @param dateStr
* @return
*/
public static Date autoConvertAsDate(String dateStr){
try {
if(null ==dateStr){
return null;
}
Object obj = StringUtils.convert(dateStr, Date.class);
if(null!=obj){
return (Date)obj;
}else{
return null;
}
} catch (Exception e) {
return null;
}
} public static SimpleDateFormat newTimeFormater(){
return new SimpleDateFormat(TIME_FORMAT_NORMAL);
}
/****
* 计算时间差,返回秒
* @param start
* @param end
* @return
*/
public static long timeDifference(long start,long end){
return (end-start)/1000;
} /* 判断输入的字符串是否是合法的生日 生日不能大于当前日期,支持 yyyy-MM-dd ,yyyyMMdd MM-dd-yyyy ,yyyy年MM月dd日等
* @param birthday 一个日期格式的字符串
* @param formats 期望转换后的日期格式数组
* @return
* */
public static boolean isRightDate(String birthday,String[] formats){ //记录传入的日期字符串,转换成日期类型
Date birth=null; //判断格式是否正确,默认值为false
boolean isRight=false;
for(String f:formats){
try {
birth =new SimpleDateFormat(f).parse(birthday);
//校验日期转换后是和传入的值不相同,说明日期传入有问题
if(!new SimpleDateFormat(f).format(birth).equals(birthday)){
return false;
}
isRight=true;
break;
} catch (ParseException e) {}
} if(isRight){
//获取当前日期的毫秒数
long now =new Date().getTime();
//获取生日的毫秒数
long birthTime = birth.getTime();
//如果当前时间小于生日,生日不合法。反之合法
return birthTime<=now;
}else{
//输入的参数类型不是日期类型,或者类型和过滤中设置的类型不匹配
return false;
}
}
/***
* 计算时间差,返回天数
* @param b_date 大时间
* @param s_date 小时间
* @return 天数
*/
public static long dateSubtract(Date b_date,Date s_date){
if(StringUtils.blank(s_date) || StringUtils.blank(b_date)){
return 0;
}else{
long dateLong1 = b_date.getTime();
long dateLong2 = s_date.getTime();
long day = (dateLong1-dateLong2)/1000/60/60/24;
return day;
}
}
}