JAVA 日期時間的工具類
阿新 • • 發佈:2019-01-01
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; /** * * <p> * 時間轉換工具類 * </p> * * @ClassName: DateHelper * @author: fandonghong * @date 2016-11-22 上午09:48:59 * */ public class DateHelper { public final static SimpleDateFormat g_SimpleDateFormat = new SimpleDateFormat( "yyyyMMdd"); public final static SimpleDateFormat g_SimpleDateFormat_I = new SimpleDateFormat( "yyyy-MM-dd"); public final static SimpleDateFormat g_SimpleDateFormat_II = new SimpleDateFormat( "yyyyMM"); public final static SimpleDateFormat sdfDateTimeFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); public final static SimpleDateFormat sdfDateTimeFormat_I = new SimpleDateFormat( "yyyyMMddHHmmss"); public final static SimpleDateFormat sdfDateTimeFormat_IIII = new SimpleDateFormat( "HH:mm:ss"); public final static SimpleDateFormat sdfDateTimeFormat_YYYY = new SimpleDateFormat( "yyyy"); public final static SimpleDateFormat x_dateTimeFormat = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss"); public final static SimpleDateFormat xISO_dateTimeFormat = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss Z"); /** * 獲取當前日期 * * @return */ public static Date getCurrentDate() { Calendar calendar = Calendar.getInstance(); return calendar.getTime(); } /** * 返回當前時間日期格式(yyyyMMddHHmmss) * @return */ public static String getCurDateTime() { Calendar now = Calendar.getInstance(TimeZone.getDefault()); String DATE_FORMAT = "yyyyMMddHHmmss"; SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); sdf.setTimeZone(TimeZone.getDefault()); return (sdf.format(now.getTime())); } /** * 返回日期格式(yyyy-MM-dd HH:mm:ss) * * @param date * @return */ public static String getDateTime(java.util.Date date) { return sdfDateTimeFormat.format(date); } /** * 返回日期格式(yyyyMMdd) * * @param date * @return */ public static String getDateTime2(java.util.Date date) { return g_SimpleDateFormat.format(date); } /** * 返回日期格式(yyyy-MM-dd) * * @param date * @return */ public static String getDateTime_I(java.util.Date date) { return g_SimpleDateFormat_I.format(date); } /** * 返回日期格式(yyyy-MM-dd HH:mm:ss) * * @param date * @return */ public static String getDateTime_III(java.util.Date date) { return sdfDateTimeFormat.format(date); } /** * <p>返回日期格式(yyyy-MM-dd HH:mm:ss)</p> * <br> * @return */ public static String getCurrDateTime() { return sdfDateTimeFormat.format(new Date()); } /** * 返回時間格式(HH:mm:ss) * * @param date * @return */ public static String getDateTime_IIII(java.util.Date date) { return sdfDateTimeFormat_IIII.format(date); } /** * 返回日期格式(yyyyMMddHHmmss) * * @param date * @return */ public static String getDateTime_IV(java.util.Date date) { return sdfDateTimeFormat_I.format(date); } /** * 獲取當前日期(yyyyMMdd) * @return */ public static String getCurDate() { return g_SimpleDateFormat.format(new Date()); } /** * <p> * 獲取當前系統時間的小時數 * </p> * * @return */ public static int getCurrentHour() { Calendar calendar = new GregorianCalendar(); return calendar.get(Calendar.HOUR_OF_DAY); } /** * 得到當前時間分鐘 * @return */ public static int getCurrentMinute() { Calendar calendar = new GregorianCalendar(); return calendar.get(Calendar.MINUTE); } /** * <p> * 獲取當前年月格式(yyyyMM) * </p> * * @return */ public static String getCurrentMonth() { Calendar calendar = new GregorianCalendar(); return g_SimpleDateFormat_II.format(calendar.getTime()); } public static String getMonth(Date date) { return g_SimpleDateFormat_II.format(date); } /** * * 獲得本月的前(後)幾個月。(yyyyMM) * <p> * %方法詳述(簡單方法可不必詳述)%。 * </p> * * @param month * 月數字(數字大於1為後,小於1為前) * @return */ public static String getBAMonth(int monthNum) { Calendar calendar = new GregorianCalendar(); calendar.add(Calendar.MONTH, monthNum); return g_SimpleDateFormat_II.format(calendar.getTime()); } /** * <p> * 獲取本月第一天日期(格式如YYYYMMDD),如果當前日為當月1日,則返回上月第一日 * </p> * * @return */ public static String getMonthFirstDay() { Calendar calendar = new GregorianCalendar(); int day = calendar.get(Calendar.DAY_OF_MONTH); int month = 0; if (day == 1)// 當月第一日 { calendar.add(Calendar.MONTH, -1); } month = calendar.get(Calendar.MONTH); if (month < 10) { return "" + calendar.get(Calendar.YEAR) + "0" + (month + 1) + "01"; } else { return "" + calendar.get(Calendar.YEAR) + (month + 1) + "01"; } } /** * <p> * 獲取當前時間前幾天或後幾天的日期 * </p> * 日數字(數字大於1為後,小於1為前) * @return */ public static Date getAddDays(int days) { Calendar calendar = new GregorianCalendar(); calendar.add(Calendar.DAY_OF_YEAR, days); return calendar.getTime(); } /** * <p> * 獲取某個月後的日期格式(yyyyMMdd) * </p> * * @return */ public static String getAfterMonth(int monthNum) { Calendar calendar = new GregorianCalendar(); calendar.add(Calendar.MONTH, monthNum); return g_SimpleDateFormat.format(calendar.getTime()); } /** * <p> * 返回日期(格式yyyyMMdd) * </p> * * @param timeMillis * @return */ public static String getFormatDate(long timeMillis) { return sdfDateTimeFormat_I.format(new Date(timeMillis)); } /** * 獲取當前系統時間距離傳入時間的毫秒數 * * @param strTime * 格式[ DD:00:00] * @return * @throws ParseException */ public static long getSleepTime(String strTime) throws ParseException { long p = 1; long l_date = System.currentTimeMillis(); java.util.Date date_now = new java.util.Date(l_date); String strDate = g_SimpleDateFormat_I.format(date_now) + strTime; if (date_now.before(sdfDateTimeFormat.parse(strDate))) p = (sdfDateTimeFormat.parse(strDate)).getTime() - l_date; else { Calendar calendar = new GregorianCalendar(); calendar.setTime(date_now); calendar.add(Calendar.DAY_OF_YEAR, 1); java.util.Date date = calendar.getTime(); strDate = g_SimpleDateFormat_I.format(date) + strTime; p = (sdfDateTimeFormat.parse(strDate)).getTime() - l_date; } return p; } /** * 返回當前日期的前一天 返回格式(YYYY-mm-dd) * @return */ public static String getPredate() { Date nowDate = new Date(); String nowdates = g_SimpleDateFormat_I.format(nowDate); String[] dates = nowdates.split("-"); int year = Integer.parseInt(dates[0]); int month = Integer.parseInt(dates[1]); int day = Integer.parseInt(dates[2]) - 1; if (day == 0) { switch (month - 1) { case 1: day = 31; break; case 3: day = 31; break; case 5: day = 31; break; case 7: day = 31; break; case 8: day = 31; break; case 10: day = 31; break; case 0: month = 13; year = year - 1; day = 31; break; case 4: day = 30; break; case 6: day = 30; break; case 9: day = 30; break; case 11: day = 30; break; case 2: if (year % 4 == 0) { day = 29; } else { day = 28; } break; default: break; } month = month - 1; } String predate = Integer.toString(year) + "-"+ (month < 10 ? "0" + month : month) + "-"+ (day < 10 ? "0" + day : day); return predate; } /** * add by hushiwang * <p> * 得到xxxx年xx月xx日 日期格式。 * </p> * * @param date * @return */ public static String getChinaDateFormat(Date date) { // 得到yyyy-mm-dd格式日期格式 String dateStr = getDateTime_I(date); StringBuffer sb = new StringBuffer(); if (dateStr != null && dateStr.length() > 0) { String[] newStr = dateStr.split("-"); // 得到月 Integer month = Integer.valueOf(newStr[1]); // 得到日 Integer day = Integer.valueOf(newStr[2]); sb.append(newStr[0]).append("年"); sb.append(month).append("月").append(day).append("日"); } return sb.toString(); } /** * add by wangzs * <p> * 得到xxxx年xx月xx日xx時xx分日期格式。 * </p> * * @param date * @return */ public static String getChinaDateFormat_II(Date date) { // 得到yyyy-mm-dd HH:mm:ss格式日期格式 String dateStr = getDateTime(date); StringBuffer sb = new StringBuffer(); if (dateStr != null && dateStr.length() > 0) { String[] str = dateStr.split(" "); if (str != null && str.length > 1 ) { String[] newStr = str[0].split("-"); // 得到月 Integer month = Integer.valueOf(newStr[1]); // 得到日 Integer day = Integer.valueOf(newStr[2]); sb.append(newStr[0]).append("年"); sb.append(month).append("月").append(day).append("日"); String[] newStr_II = str[1].split(":"); sb.append(newStr_II[0]).append("時").append(newStr_II[1]).append("分"); } } return sb.toString(); } /** * add by hushiwang * <p> * 得到xxxx年xx月xx日 日期格式。 * </p> * * @param date * 格式必須是2009-03-21字串 * @return */ public static String getChinaDateFormat(String date) { // 得到yyyy-mm-dd格式日期格式 StringBuffer sb = new StringBuffer(); if (date != null && date.length() > 0) { String[] newStr = date.split("-"); // 得到月 Integer month = Integer.valueOf(newStr[1]); // 得到日 Integer day = Integer.valueOf(newStr[2]); sb.append(newStr[0]).append("年"); sb.append(month).append("月").append(day).append("日"); } return sb.toString(); } /** * 判斷一個日期字串是否合法 * * @param date * @param format * @return * */ public static boolean isDateStringCorrect(String date, String format) { SimpleDateFormat df = new SimpleDateFormat(format); try { df.setLenient(false); df.parse(date); return true; } catch (Exception e) { return false; } } /** * * <P> * 將字串型別的日期格式 轉換為 符合要求的日期格式 * </P> * * @param date * @param format * @return */ public static String getStrDate4String(String date, String format) { if (date == null || date.trim().equals("")) { return ""; } else { SimpleDateFormat df = new SimpleDateFormat(format); try { Date d = df.parse(date); return df.format(d); } catch (ParseException e) { System.out.println(e); return ""; } } } /** * * <P> * 將Date型別的日期格式 轉換為 符合要求的 String日期格式 * </P> * * @param date * @param format * @return */ public static String getStrDate4Date(Date date, String format) { if (date == null) { return ""; } else { SimpleDateFormat df = new SimpleDateFormat(format); return df.format(date); } } /** * * <P> * 將字串型別的日期格式 轉換為 符合要求的 Date型別的日期格式 * </P> * * @param date * @param format * @return */ public static Date getDate4StrDate(String date, String format) { if (date == null || date.trim().equals("")) { return null; } else { SimpleDateFormat df = new SimpleDateFormat(format); try { return df.parse(date); } catch (ParseException e) { return null; } } } /** * 計算指定日期時間之間的時間差 * * @param beginStr * 開始日期字串 * @param endStr * 結束日期字串 * @param f * 時間差的形式0-秒,1-分種,2-小時,3--天 日期時間字串格式:yyyyMMddHHmmss * */ public static int getInterval(String beginStr, String endStr, int f) { int hours = 0; try { Date beginDate = sdfDateTimeFormat.parse(beginStr); Date endDate = sdfDateTimeFormat.parse(endStr); long millisecond = endDate.getTime() - beginDate.getTime(); // 日期相減得到日期差X(單位:毫秒) /** * Math.abs((int)(millisecond/1000)); 絕對值 1秒 = 1000毫秒 * millisecond/1000 --> 秒 millisecond/1000*60 - > 分鐘 * millisecond/(1000*60*60) -- > 小時 millisecond/(1000*60*60*24) --> * 天 * */ switch (f) { case 0: // second return (int) (millisecond / 1000); case 1: // minute return (int) (millisecond / (1000 * 60)); case 2: // hour return (int) (millisecond / (1000 * 60 * 60)); case 3: // day return (int) (millisecond / (1000 * 60 * 60 * 24)); } } catch (Exception e) { e.printStackTrace(); } return hours; } /** * * <P> * 得到起始日期前或後天數的日期 * </P> * * @param starttime * 起始日期 格式:yyyy-MM-dd * @param days * @return * @throws ParseException */ public static Date getStartDateInterval(String starttime, int days) { // 格式化起始時間 yyyyMMdd Date startDate = null; try { startDate = g_SimpleDateFormat_I.parse(starttime); } catch (ParseException e) { e.printStackTrace(); } Calendar startTime = Calendar.getInstance(); startTime.clear(); startTime.setTime(startDate); startTime.add(Calendar.DAY_OF_YEAR, days); return startTime.getTime(); } /** * * <P> * 得到起始日期和結束日期之間的天數 * </P> * * @param beginStr * 起始日期 * @param endStr * 結束日期 * @param format * 根據 日期引數的格式,傳對應的SimpleDateFormat格式 * @return 天數 */ public static int getDaysInterval(String beginStr, String endStr, SimpleDateFormat format) { try { Date beginDate = format.parse(beginStr); Date endDate = format.parse(endStr); long millisecond = endDate.getTime() - beginDate.getTime(); // 日期相減得到日期差X(單位:毫秒) return (int) (millisecond / (1000 * 60 * 60 * 24)); } catch (ParseException e) { e.printStackTrace(); } return 0; } /** * 得到某個時間當天的最後時間 (時分秒為 23:59:59形式) */ public static Date getEndDate(Date date){ if(date!=null){ //將截止時間設為指定日期的23:59:59 date.setHours(23); date.setMinutes(59); date.setSeconds(59); } return date; } /** * 得到本月第一天 * @return */ public static Date getFristDayOfMonth() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); return calendar.getTime(); } /** * 得到本月最後一天 * @return */ public static Date getLastDayOfMonth() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); return calendar.getTime(); } /** * 獲得本週一的日期 * @return * @throws ParseException */ public static Date getMondayOFWeek() throws ParseException { int mondayPlus = getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(Calendar.DATE, mondayPlus); Date monday = currentDate.getTime(); String dateStr = getDateTime_I(monday); StringBuffer sb = new StringBuffer(dateStr); sb.append(" ").append("00:00:00"); return parseDateStrToDate(sb.toString()); } /** * 獲得本週星期日的日期 * @return * @throws ParseException */ public static Date getCurrentWeekday() throws ParseException { int mondayPlus = getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(Calendar.DATE, mondayPlus + 6); Date monday = currentDate.getTime(); String dateStr = getDateTime_I(monday); StringBuffer sb = new StringBuffer(dateStr); sb.append(" ").append("00:00:00"); return parseDateStrToDate(sb.toString()); } /** * 字串時間格式轉換為 Date * @param date 此格式 yyyy-MM-dd HH:mm:ss * @return * @throws ParseException */ public static Date parseDateStrToDate(String date) throws ParseException{ Date date_time = null; if(!StringUtil.isEmpty(date)){ date_time = sdfDateTimeFormat.parse(date); } return date_time; } /** * 字串時間格式轉換為 Date * @param date 此格式 yyyy-MM-dd * @return * @throws ParseException */ public static Date parseDateFromStr(String date) throws ParseException{ Date date_time = null; if(!StringUtil.isEmpty(date)){ date_time = g_SimpleDateFormat_I.parse(date); } return date_time; } public static int getMondayPlus() { Calendar cd = Calendar.getInstance(); // 因為按中國禮拜一作為第一天所以這裡減1 int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1; if (dayOfWeek == 1) { return 0; }else if(dayOfWeek==0){ return 1-7; } else { return 1 - dayOfWeek; } } /** * 得到當天開始時間 * @return * @throws ParseException */ public static Date getTodayStartDateTime(Date date) throws ParseException{ String dateStr = getDateTime_I(date); StringBuffer sb = new StringBuffer(dateStr); sb.append(" ").append("00:00:00"); return parseDateStrToDate(sb.toString()); } /** * 得到當前年份 * @return */ public static int getCurrentYear(){ Calendar c = Calendar.getInstance(); return c.get(Calendar.YEAR); } /** * 得到當前月份 * @return */ public static int getMonth(){ Calendar c = Calendar.getInstance(); return c.get(Calendar.MONTH)+1; } /** * 得到當前日 * @return */ public static int getDayOfMonth(){ Calendar c = Calendar.getInstance(); return c.get(Calendar.DAY_OF_MONTH); } /** * <p>獲得指定的年,int格式</p> * <br> * @param date * @return */ public static int getCustomYear(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.YEAR); } /** * <p>獲得指定的月,int格式</p> * <br> * @param date * @return * */ public static int getCustomMonth(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.MONTH)+1; } /** * <p>獲得指定的日(月份中的),int格式</p> * <br> * @param date * @return */ public static int getCustomDayOfMonth(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.DAY_OF_MONTH); } /** * <p>獲得指定的小時(日中的),int格式</p> * <br> * @return */ public static int getCustomHour(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.HOUR_OF_DAY); } /** * <p>獲得指定的分鐘,int格式</p> * <br> * @return */ public static int getCustomMinute(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.MINUTE); } /** * <p>獲得指定的秒,int格式</p> * <br> * @return */ public static int getCustomSecond(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.SECOND); } /** * * @param beginDate * @param endDate * @param f * 時間差的形式0:秒,1:分種,2:小時,3:天 * @return */ public static int getDifferenceNum(Date beginDate,Date endDate,int f){ int result = 0; if(beginDate==null || endDate==null){ return 0; } try{ // 日期相減得到日期差X(單位:毫秒) long millisecond = endDate.getTime() - beginDate.getTime(); /** * Math.abs((int)(millisecond/1000)); 絕對值 1秒 = 1000毫秒 * millisecond/1000 --> 秒 millisecond/1000*60 - > 分鐘 * millisecond/(1000*60*60) -- > 小時 millisecond/(1000*60*60*24) --> * 天 * */ switch (f) { case 0: // second return (int) (millisecond / 1000); case 1: // minute return (int) (millisecond / (1000 * 60)); case 2: // hour return (int) (millisecond / (1000 * 60 * 60)); case 3: // day return (int) (millisecond / (1000 * 60 * 60 * 24)); } } catch (Exception e) { e.printStackTrace(); } return result; } /** * <p>比較兩個日期的大小,精確到秒</p> * * @param d1 * @param d2 * @date 2016-11-22 * @return 返回一個long型別的整數,若大於0表示第一個日期晚於第二個日期,小於0表示第一個日期早於第二個日期,否則相等 */ public static long compareEachOther(Date d1, Date d2){ if(d1 == null || d2 == null) return -1; String d1Str = d1.getTime() + ""; String d2Str = d2.getTime() + ""; int l1 = d1Str.length(); int l2 = d2Str.length(); d1Str = d1Str.substring(0, l1 - 3) + "000"; d2Str = d2Str.substring(0, l2 - 3) + "000"; //System.out.println(d1Str + " " + d2Str); long long1 = Long.parseLong(d1Str); long long2 = Long.parseLong(d2Str); return long1 - long2; } public static void main(String[] args) throws ParseException { // //獲取當前日期 // System.out.println(getCurrentDate()); // //返回當前時間日期格式(yyyyMMddHHmmss) // System.out.println(getCurDateTime()); // //返回日期格式(yyyy-MM-dd HH:mm:ss) // System.out.println(getDateTime(new Date())); // //返回日期格式(yyyyMMdd) // System.out.println(getDateTime2(new Date())); // //獲取當前年月格式(yyyyMM) // System.out.println(getCurrentMonth()); // // 獲得本月的幾個月。(yyyyMM) // System.out.println(getBAMonth(-8)); // //獲取本月第一天日期(格式如YYYYMMDD),如果當前日為當月1日,則返回上月第一日 // System.out.println(getMonthFirstDay()); // //獲取當前時間前幾天或後幾天的日期 // System.out.println(getAddDays(-1)); // //獲取某個月後的日期格式 // System.out.println(getAfterMonth(-1)); System.out.println(getPredate()); // System.out.println(getFristDayOfMonth()); // // // System.out.println(getCurrentYear()); // // // System.out.println(getMonth()); // // // System.out.println(getDayOfMonth()); } }