//有些地方須要修改 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; } } }