Java操作Date的工具類
阿新 • • 發佈:2018-11-16
import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; /** * 日期處理 * * @vesion 1.0 */ public class DateUtil { private final static String DATE_AND_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; private final static String DATE_AND_TIME_MS_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; private final static String TIME_FORMAT = "HH:mm:ss"; private final static String MM_DD_YYYY_FORMAT = "yyyy-MM-dd"; private final static String DATE_WITHOUT_SEPARATOR_FORMAT = "yyyyMMdd"; private final static String DATE_WITH_SEPARATOR_FORMAT = "yyyy-MM-dd"; private final static String DATE_YEAR_AND_MONTH_WITH_SEPARATOR_FORMAT = "yyyy-MM"; private final static String DATE_YEAR_AND_MONTH_WITH_CHINESE_FORMAT = "yyyy年MM月"; private final static String DATETIME_WITHOUT_SEPARATOR_FORMAT = "yyyyMMddHHmmss"; private final static String DATETIME_WITHOUT_SEPARATOR_FORMAT_SPACE = "yyyyMMdd HHmmss"; private final static String MM_DD_AND_HH_MM = "MM月dd日 HH:mm"; // 定義時間日期顯示格式 private final static String DATE_FORMAT = "yyyy-MM-dd"; /** * 獲得timestamp型別的當前系統日期 * * @return */ public Timestamp getDateTime() { return new Timestamp(new Date().getTime()); } /** * 獲取當前系統日期前一日的日期 * * @desc * @return * @author yang.jianqi * @date 2016-3-2 11:33:05 * @version 1.0 */ public static Date getYesterDayStr() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_YEAR, -1); return cal.getTime(); } /** * 把形如"2012-12-21";的字串轉換成時間 * * @desc * @param mmDDYYYStr * @return * @author yang.shuai * @date 2011-12-16 下午03:05:00 * @version 1.0 */ public static Date getDateFromDateStr(String dateStr) { SimpleDateFormat insdf = new SimpleDateFormat(MM_DD_YYYY_FORMAT); try { if (dateStr == null || dateStr.trim().isEmpty()) { return null; } return insdf.parse(dateStr); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } /** * 把形如"20121221";的字串轉換成時間 * * @desc * @param mmDDYYYStr * @return * @author yang.jianqi * @date 2016-3-2 10:31:44 * @version 1.0 */ public static Date getDateWithoutSeparatorFromDateStr(String dateStr) { SimpleDateFormat insdf = new SimpleDateFormat( DATE_WITHOUT_SEPARATOR_FORMAT); try { if (dateStr == null || dateStr.trim().isEmpty()) { return null; } return insdf.parse(dateStr); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } /** * 把形如"2012-02";的字串轉換成時間 * * @param dateStr * @return */ public static Date getDateFromDateTimeYearMonthStr(String dateStr) { SimpleDateFormat insdf = new SimpleDateFormat(DATE_YEAR_AND_MONTH_WITH_SEPARATOR_FORMAT); try { if ((dateStr == null) || (dateStr.trim().isEmpty())) { return null; } return insdf.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 把形如"2012-12-21 10:24:30";的字串轉換成時間 * * @param dateStr * @return */ public static Date getDateFromDateTimeStr(String dateStr) { SimpleDateFormat insdf = new SimpleDateFormat(DATE_AND_TIME_FORMAT); try { if ((dateStr == null) || (dateStr.trim().isEmpty())) { return null; } return insdf.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 把形如"20121221 102430";的字串轉換成時間 * * @param dateStr * @return */ public static Date getDateFromDateTimeSpaceWithoutSeparator(String dateStr) { SimpleDateFormat insdf = new SimpleDateFormat( DATETIME_WITHOUT_SEPARATOR_FORMAT_SPACE); try { if ((dateStr == null) || (dateStr.trim().isEmpty())) { return null; } return insdf.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 把形如"20121221102430";的字串轉換成時間 * * @param dateStr * @return */ public static Date getDateFromDateTimeWithoutSeparator(String dateStr) { SimpleDateFormat insdf = new SimpleDateFormat( DATETIME_WITHOUT_SEPARATOR_FORMAT); try { if ((dateStr == null) || (dateStr.trim().isEmpty())) { return null; } return insdf.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 根據引數獲得java.sql.Date型別 dateTime為需要轉換的日期引數,pattern為轉換格式。 方法呼叫: * getDateTime("",Util.DEFAULT_DATE_PATTERN_All),則按預設時間格式輸出,格式如下 * <code>yyyy-MM-dd HH:mm:ss</code> * * @param dateTime * @param pattern * @return java.sql.Date */ public static Date getDateTime(String dateTime, String pattern) { DateFormat dateFormat = getSimpleDateFormat(pattern); Date date = null; try { date = dateFormat.parse(dateTime); } catch (Exception e) { // e.printStackTrace(); return null; } return date; } /** * 根據引數獲得java.sql.Date型別 根據年、月、日引數和pattern指定的轉換格式,返回對應的日期字串。 方法呼叫: * getDateTime(Util.DEFAULT_DATE_PATTERN_All,2010,6,10),則按預設時間格式輸出內容如下 * <code>2010-06-10 00:00:00</code> * * @param pattern * @param year * 年 * @param month * 月 * @param date * 日 * @return java.sql.Date */ public static String getDateTime(String pattern, int year, int month, int date) { DateFormat df = getSimpleDateFormat(pattern); Calendar c = Calendar.getInstance(); c.set(year, month - 1, date); return df.format(c.getTime()); } /** * 根據指定日期轉換格式獲得對應日期的時間字串 * * @param pattern * @param dateTime * @return String */ public String getDateTime(String pattern, Object dateTime) { return getSimpleDateFormat(pattern).format(dateTime); } /** * 獲取Date型別的全字串表示格式 例子:d => yyyy-MM-dd HH:mm:ss * * @desc * @param d * @return * @author yang.shuai * @date 2011-11-8 下午02:57:27 * @version 1.0 */ public static String getDateTimeStr(Date d) { if (d == null) { return ""; } final SimpleDateFormat insdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); return insdf.format(d); } /** * 獲取Date型別的全字串表示格式 例子:d => yyyy-MM-dd * * @desc * @param d * @return * @author yang.shuai * @date 2011-11-8 下午02:57:27 * @version 1.0 */ public static String getDateStr(Date d) { if (d == null) { return ""; } final SimpleDateFormat insdf = new SimpleDateFormat("yyyy-MM-dd"); return insdf.format(d); } /** * 獲取String型別的全字串表示格式 例子:d => yyyy-MM-dd * * @param d * @return */ public static String getString2DateStr(String d) { Date date = null; if (d == null) { return ""; } else { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");// 小寫的mm表示的是分鐘 try { date = sdf.parse(d); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } SimpleDateFormat insdf = new SimpleDateFormat("yyyy-MM-dd"); return insdf.format(date); } /** * 獲得 java.text.SimpleDateFormat * * @param pattern * @return */ public static SimpleDateFormat getSimpleDateFormat(String pattern) { return new SimpleDateFormat(pattern); } /** * 獲得指定日期格式的指定日期時間範圍內的所有日期。 * * @param pattern * 指定日期格式,若引數預設為Util.DEFAULT_DATE_PATTERN_YEAR_MONTH_DATE * @param startdate * 開始時間 * @param enddate * 結束時間 * @return String[] */ public static String[] getHotelDate(String pattern, String startdate, String enddate) { SimpleDateFormat f = new SimpleDateFormat(pattern); try { Date d1 = f.parse(startdate); Date d2 = f.parse(enddate); long days = (d2.getTime() - d1.getTime()) / 3600000 / 24; Calendar startcal = Calendar.getInstance(); Calendar endcal = Calendar.getInstance(); startcal.setTime(d1); endcal.setTime(d2); String hotelDate[] = new String[(int) days + 1]; hotelDate[0] = f.format(d1); int i = 1; while (endcal.after(startcal)) { if (i <= days) startcal.add(Calendar.DATE, 1); hotelDate[i] = f.format(startcal.getTime()); i++; } return hotelDate; } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 獲得當前日期為每週的第幾天 * * @param pattern * @param dateTime * @return */ public static int getDayOfWeek(String pattern, String dateTime) { Date date = null; try { date = getSimpleDateFormat(pattern).parse(dateTime); } catch (ParseException e) { // logger.error("解析日期格式錯誤,錯誤資訊為:" + e.getMessage()); } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int weekOfDay = calendar.get(Calendar.DAY_OF_WEEK); if (weekOfDay == 1) { weekOfDay = 7; return weekOfDay; } return weekOfDay - 1; } /** * 根據引數,獲得幾天後的日期 * * @param pattern * 日期解析型別 * @param dateTime * 需要轉換的日期 * @return */ public Date getDateAfter(String pattern, Date dateTime) { int defaultDate = 7; Calendar now = Calendar.getInstance(); now.setTime(dateTime); now.set(Calendar.DATE, now.get(Calendar.DATE) + defaultDate); return now.getTime(); } /** * 根據引數,獲得幾天前的日期 * * @param pattern * 日期解析型別 * @param dateTime * 需要轉換的日期 * @param defaultDate * 天數 * @author zhu.yiming * @date 2016-8-25 15:02:00 * @version 1.0 * @return */ public static Date getDateBefore(Date dateTime, int defaultDate) { Calendar now = Calendar.getInstance(); now.setTime(dateTime); now.set(Calendar.DATE, now.get(Calendar.DATE) - defaultDate); return now.getTime(); } /** * 根據引數,獲得後幾天前的日期 * * @param pattern * 日期解析型別 * @param dateTime * 需要轉換的日期 * @param defaultDate * 天數 * @author zhu.yiming * @date 2016-8-25 15:02:00 * @version 1.0 * @return */ public static Date getDateAfter(Date dateTime, int defaultDate) { Calendar now = Calendar.getInstance(); now.setTime(dateTime); now.set(Calendar.DATE, now.get(Calendar.DATE) + defaultDate); return now.getTime(); } /** * 根據當前系統時間獲取零點和二十四點的時間 * * @author zhu.yiming * @date 2016-8-25 15:03:00 * @version 1.0 * @return * @remark 對於20161026這樣格式的日期 zeroDate獲取到2016-10-25 00:00:00 */ public static Map getZeroDateAndTwelveDate(long current) { long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();// 今天零點零分零秒的毫秒數 long twelve = zero + 24 * 60 * 60 * 1000 - 1;// 今天23點59分59秒的毫秒數 Map<String, Date> dateMap = new HashMap<String, Date>(); dateMap.put("zeroDate", new Date(zero)); dateMap.put("twelveDate", new Date(twelve)); return dateMap; } /** * 獲得當前日期是每週的周幾 * * @return String */ public String getCurrentDayofWeek() { StringBuffer sb = new StringBuffer(); DateFormat dateFormat = getSimpleDateFormat("yyyy-MM-dd"); String dateTime = dateFormat.format(new Date()); int sIndex = dateTime.indexOf("-"); int eIndex = dateTime.lastIndexOf("-"); String year = dateTime.substring(0, sIndex); String month = dateTime.substring(sIndex + 1, eIndex); String day = dateTime.substring(eIndex + 1, dateTime.length()); sb.append("日期:"); sb.append(year + "年"); sb.append(month + "月"); sb.append(day + "日"); int temp = getDayOfWeek("yyyy-MM-dd", dateTime); if (temp == 0) { sb.append(" 週日"); } else { switch (temp - 1) { case 1: sb.append(" 週一"); break; case 2: sb.append(" 週二"); break; case 3: sb.append(" 週三"); break; case 4: sb.append(" 週四"); break; case 5: sb.append(" 週五"); break; case 6: sb.append(" 週六"); break; default: break; } } return sb.toString(); } /** * 獲得當前日期周的週一 * * @return */ public String getCurrentMonday() { int mondayPlus = getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus); Date monday = currentDate.getTime(); SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date modayDate = null; try { modayDate = dateFormat.parse(dateFormat.format(monday)); } catch (ParseException e) { // logger.error("解析日期格式錯誤,錯誤資訊為:" + e.getMessage()); } return dateFormat.format(modayDate); } /** * 獲得當前日期與本週一相差的天數 * * @return */ private int getMondayPlus() { Calendar cd = Calendar.getInstance(); int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK); if (dayOfWeek == 1) { return -6; } else { return 2 - dayOfWeek; } } /** * 得到格式化後的時間,格式為yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45 * * @param currDate * 要格式化的時間 * @see #getFormatDateTime(java.util.Date, String) * @return String 返回格式化後的時間,預設格式為yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45 * @author jiang.hao */ public static String getFormatDateTime(java.util.Date currDate) { return getFormatDate(currDate, DATE_AND_TIME_FORMAT); } /** * 得到格式化後的時間,格式為yyyy-MM-dd HH:mm:ss.SSS,如2006-02-15 15:23:45.000 * * @param currDate * 要格式化的時間 * @see #getFormatDateTime(java.util.Date, String) * @return String 返回格式化後的時間,預設格式為yyyy-MM-dd HH:mm:ss.SSS,如2006-02-15 * 15:23:45.000 * @author yang.jianqi */ public static String getMSFormatDateTime(java.util.Date currDate) { return getFormatDate(currDate, DATE_AND_TIME_MS_FORMAT); } public static String getFormatTime(java.util.Date date) { return getFormatDate(date, TIME_FORMAT); } public static String getDateWithoutSeparator(java.util.Date date) { return getFormatDate(date, DATE_WITHOUT_SEPARATOR_FORMAT); } public static String getDateWithSeparator(java.util.Date date) { return getFormatDate(date, DATE_WITH_SEPARATOR_FORMAT); } public static String getDateYearAndMonthWithSeparator(java.util.Date date) { return getFormatDate(date, DATE_YEAR_AND_MONTH_WITH_SEPARATOR_FORMAT); } /** * 返回yyyy年MM月格式的字串 * @param date * @return */ public static String getDateYearAndMonthWithChineseSeparator(java.util.Date date) { return getFormatDate(date, DATE_YEAR_AND_MONTH_WITH_CHINESE_FORMAT); } public static String getDateTimeWithoutSeparator(java.util.Date date) { return getFormatDate(date, DATETIME_WITHOUT_SEPARATOR_FORMAT); } /** * 根據格式得到格式化後的日期 * * @param currDate * 要格式化的日期 * @param format * 日期格式,如yyyy-MM-dd * @see java.text.SimpleDateFormat#format(java.util.Date) * @return String 返回格式化後的日期,格式由引數<code>format</code> * 定義,如yyyy-MM-dd,如2006-02-15 */ public static String getFormatDate(java.util.Date currDate, String format) { if (currDate == null) { return ""; } SimpleDateFormat dtFormatdB = null; try { dtFormatdB = new SimpleDateFormat(format); return dtFormatdB.format(currDate); } catch (Exception e) { dtFormatdB = new SimpleDateFormat(DATE_FORMAT); try { return dtFormatdB.format(currDate); } catch (Exception ex) { } } return null; } /** * 獲得當前日期的該月第一天日期 */ @SuppressWarnings("deprecation") public static String getFirstDate(String datetime, String formate) { datetime = getDateTimeStr(getDateTime(datetime, DATE_FORMAT)); String month = datetime.substring(5, 7); System.out.println(month); return datetime.substring(0, 8) + "01"; } /** * 獲取月份的最後一天 * * @param dateTime * @return */ public static String getLastDate(String dateTime) { String lastday = null; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar cale = Calendar.getInstance(); try { cale.setTime(sdf.parse(dateTime)); cale.add(Calendar.MONTH, 1); cale.set(Calendar.DAY_OF_MONTH, 0); lastday = sdf.format(cale.getTime()); } catch (ParseException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } return lastday; } /** * 得到格式化後的時間,格式為MM月dd日 HH:mm,如02月15日 15:23 * * @param currDate * 要格式化的時間 * @see #getFormatDateTime(java.util.Date, String) * @return String 返回格式化後的時間,預設格式為MM月dd日 HH:mm,如02月15日 15:23 * @author jiang.hao */ public static String getFormatTradeDateTime(java.util.Date currDate) { return getFormatDate(currDate, MM_DD_AND_HH_MM); } /** * 獲取該時間的前幾個月 * * @param dateTime * @param defaultMonth * @return */ public static Date getDateBeforeByMonth(Date dateTime, int defaultMonth) { Calendar c = Calendar.getInstance(); c.setTime(dateTime); c.add(Calendar.MONTH, - defaultMonth); return c.getTime(); } /** * 獲取該時間的後幾個月 * * @param dateTime * @param defaultMonth * @return */ public static Date getDateAfterByMonth(Date dateTime, int defaultMonth) { Calendar c = Calendar.getInstance(); c.setTime(dateTime); c.add(Calendar.MONTH, defaultMonth); return c.getTime(); } /** * 獲取年份 * * @param dateTime * @return */ public static int getYear(Date dateTime) { Calendar c = Calendar.getInstance(); c.setTime(dateTime); return c.get(Calendar.YEAR); } /** * 獲取月份(第幾月) * * @param dateTime * @return */ public static int getMonth(Date dateTime) { Calendar c = Calendar.getInstance(); c.setTime(dateTime); return c.get(Calendar.MONTH) + 1; } /** * 獲取季度(第幾季度) * * @param dateTime * @return */ public static int getQuarter(Date dateTime) { int month = getMonth(dateTime); return (month -1 + 3)/3; } public static void main(String[] args) { long current = System.currentTimeMillis();// 當前時間毫秒數 long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();// 今天零點零分零秒的毫秒數 long twelve = zero + 24 * 60 * 60 * 1000;// 今天23點59分59秒的毫秒數 System.out.println(getFirstDate("2012-02-06", "yyyy-MM-dd")); System.out.println(new Date(zero));// 今天零點零分零秒 System.out.println(new Date(twelve));// 今天23點59分59秒 System.out.println(getDateBefore(new Date(), 30)); System.out.println(getDateFromDateTimeWithoutSeparator("20170627205549")); } }