java日期工具类DateUtil

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java日期工具类DateUtil相关的知识,希望对你有一定的参考价值。

package com.itkt.mtravel.hotel.util;  

  1. import java.text.ParsePosition;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.ArrayList;  
  4. import java.util.Calendar;  
  5. import java.util.Date;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9. public class DateUtil {  
  10. private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>();  
  11. private static final Object object = new Object();  
  12. /** 
  13.      * 获取SimpleDateFormat 
  14.      * @param pattern 日期格式 
  15.      * @return SimpleDateFormat对象 
  16.      * @throws RuntimeException 异常:非法日期格式 
  17.      */  
  18. private static SimpleDateFormat getDateFormat(String pattern) throws RuntimeException {  
  19.         SimpleDateFormat dateFormat = threadLocal.get();  
  20. if (dateFormat == null) {  
  21. synchronized (object) {  
  22. if (dateFormat == null) {  
  23.                     dateFormat = new SimpleDateFormat(pattern);  
  24.                     dateFormat.setLenient(false);  
  25.                     threadLocal.set(dateFormat);  
  26.                 }  
  27.             }  
  28.         }  
  29.         dateFormat.applyPattern(pattern);  
  30. return dateFormat;  
  31.     }  
  32. /** 
  33.      * 获取日期中的某数值。如获取月份 
  34.      * @param date 日期 
  35.      * @param dateType 日期格式 
  36.      * @return 数值 
  37.      */  
  38. private static int getInteger(Date date, int dateType) {  
  39. int num = 0;  
  40.         Calendar calendar = Calendar.getInstance();  
  41. if (date != null) {  
  42.             calendar.setTime(date);  
  43.             num = calendar.get(dateType);  
  44.         }  
  45. return num;  
  46.     }  
  47. /** 
  48.      * 增加日期中某类型的某数值。如增加日期 
  49.      * @param date 日期字符串 
  50.      * @param dateType 类型 
  51.      * @param amount 数值 
  52.      * @return 计算后日期字符串 
  53.      */  
  54. private static String addInteger(String date, int dateType, int amount) {  
  55.         String dateString = null;  
  56.         DateStyle dateStyle = getDateStyle(date);  
  57. if (dateStyle != null) {  
  58.             Date myDate = StringToDate(date, dateStyle);  
  59.             myDate = addInteger(myDate, dateType, amount);  
  60.             dateString = DateToString(myDate, dateStyle);  
  61.         }  
  62. return dateString;  
  63.     }  
  64. /** 
  65.      * 增加日期中某类型的某数值。如增加日期 
  66.      * @param date 日期 
  67.      * @param dateType 类型 
  68.      * @param amount 数值 
  69.      * @return 计算后日期 
  70.      */  
  71. private static Date addInteger(Date date, int dateType, int amount) {  
  72.         Date myDate = null;  
  73. if (date != null) {  
  74.             Calendar calendar = Calendar.getInstance();  
  75.             calendar.setTime(date);  
  76.             calendar.add(dateType, amount);  
  77.             myDate = calendar.getTime();  
  78.         }  
  79. return myDate;  
  80.     }  
  81. /** 
  82.      * 获取精确的日期 
  83.      * @param timestamps 时间long集合 
  84.      * @return 日期 
  85.      */  
  86. private static Date getAccurateDate(List<Long> timestamps) {  
  87.         Date date = null;  
  88. long timestamp = 0;  
  89.         Map<Long, long[]> map = new HashMap<Long, long[]>();  
  90.         List<Long> absoluteValues = new ArrayList<Long>();  
  91. if (timestamps != null && timestamps.size() > 0) {  
  92. if (timestamps.size() > 1) {  
  93. for (int i = 0; i < timestamps.size(); i++) {  
  94. for (int j = i + 1; j < timestamps.size(); j++) {  
  95. long absoluteValue = Math.abs(timestamps.get(i) - timestamps.get(j));  
  96.                         absoluteValues.add(absoluteValue);  
  97. long[] timestampTmp = { timestamps.get(i), timestamps.get(j) };  
  98.                         map.put(absoluteValue, timestampTmp);  
  99.                     }  
  100.                 }  
  101. // 有可能有相等的情况。如2012-11和2012-11-01。时间戳是相等的。此时minAbsoluteValue为0  
  102. // 因此不能将minAbsoluteValue取默认值0  
  103. long minAbsoluteValue = -1;  
  104. if (!absoluteValues.isEmpty()) {  
  105.                     minAbsoluteValue = absoluteValues.get(0);  
  106. for (int i = 1; i < absoluteValues.size(); i++) {  
  107. if (minAbsoluteValue > absoluteValues.get(i)) {  
  108.                             minAbsoluteValue = absoluteValues.get(i);  
  109.                         }  
  110.                     }  
  111.                 }  
  112. if (minAbsoluteValue != -1) {  
  113. long[] timestampsLastTmp = map.get(minAbsoluteValue);  
  114. long dateOne = timestampsLastTmp[0];  
  115. long dateTwo = timestampsLastTmp[1];  
  116. if (absoluteValues.size() > 1) {  
  117.                         timestamp = Math.abs(dateOne) > Math.abs(dateTwo) ? dateOne : dateTwo;  
  118.                     }  
  119.                 }  
  120.             } else {  
  121.                 timestamp = timestamps.get(0);  
  122.             }  
  123.         }  
  124. if (timestamp != 0) {  
  125.             date = new Date(timestamp);  
  126.         }  
  127. return date;  
  128.     }  
  129. /** 
  130.      * 判断字符串是否为日期字符串 
  131.      * @param date 日期字符串 
  132.      * @return true or false 
  133.      */  
  134. public static boolean isDate(String date) {  
  135. boolean isDate = false;  
  136. if (date != null) {  
  137. if (getDateStyle(date) != null) {  
  138.                 isDate = true;  
  139.             }  
  140.         }  
  141. return isDate;  
  142.     }  
  143. /** 
  144.      * 获取日期字符串的日期风格。失敗返回null。 
  145.      * @param date 日期字符串 
  146.      * @return 日期风格 
  147.      */  
  148. public static DateStyle getDateStyle(String date) {  
  149.         DateStyle dateStyle = null;  
  150.         Map<Long, DateStyle> map = new HashMap<Long, DateStyle>();  
  151.         List<Long> timestamps = new ArrayList<Long>();  
  152. for (DateStyle style : DateStyle.values()) {  
  153. if (style.isShowOnly()) {  
  154. continue;  
  155.             }  
  156.             Date dateTmp = null;  
  157. if (date != null) {  
  158. try {  
  159.                     ParsePosition pos = new ParsePosition(0);  
  160.                     dateTmp = getDateFormat(style.getValue()).parse(date, pos);  
  161. if (pos.getIndex() != date.length()) {  
  162.                         dateTmp = null;  
  163.                     }  
  164.                 } catch (Exception e) {  
  165.                 }  
  166.             }  
  167. if (dateTmp != null) {  
  168.                 timestamps.add(dateTmp.getTime());  
  169.                 map.put(dateTmp.getTime(), style);  
  170.             }  
  171.         }  
  172.         Date accurateDate = getAccurateDate(timestamps);  
  173. if (accurateDate != null) {  
  174.             dateStyle = map.get(accurateDate.getTime());  
  175.         }  
  176. return dateStyle;  
  177.     }  
  178. /** 
  179.      * 将日期字符串转化为日期。失败返回null。 
  180.      * @param date 日期字符串 
  181.      * @return 日期 
  182.      */  
  183. public static Date StringToDate(String date) {  
  184.         DateStyle dateStyle = getDateStyle(date);  
  185. return StringToDate(date, dateStyle);  
  186.     }  
  187. /** 
  188.      * 将日期字符串转化为日期。失败返回null。 
  189.      * @param date 日期字符串 
  190.      * @param pattern 日期格式 
  191.      * @return 日期 
  192.      */  
  193. public static Date StringToDate(String date, String pattern) {  
  194.         Date myDate = null;  
  195. if (date != null) {  
  196. try {  
  197.                 myDate = getDateFormat(pattern).parse(date);  
  198.             } catch (Exception e) {  
  199.             }  
  200.         }  
  201. return myDate;  
  202.     }  
  203. /** 
  204.      * 将日期字符串转化为日期。失败返回null。 
  205.      * @param date 日期字符串 
  206.      * @param dateStyle 日期风格 
  207.      * @return 日期 
  208.      */  
  209. public static Date StringToDate(String date, DateStyle dateStyle) {  
  210.         Date myDate = null;  
  211. if (dateStyle != null) {  
  212.             myDate = StringToDate(date, dateStyle.getValue());  
  213.         }  
  214. return myDate;  
  215.     }  
  216. /** 
  217.      * 将日期转化为日期字符串。失败返回null。 
  218.      * @param date 日期 
  219.      * @param pattern 日期格式 
  220.      * @return 日期字符串 
  221.      */  
  222. public static String DateToString(Date date, String pattern) {  
  223.         String dateString = null;  
  224. if (date != null) {  
  225. try {  
  226.                 dateString = getDateFormat(pattern).format(date);  
  227.             } catch (Exception e) {  
  228.             }  
  229.         }  
  230. return dateString;  
  231.     }  
  232. /** 
  233.      * 将日期转化为日期字符串。失败返回null。 
  234.      * @param date 日期 
  235.      * @param dateStyle 日期风格 
  236.      * @return 日期字符串 
  237.      */  
  238. public static String DateToString(Date date, DateStyle dateStyle) {  
  239.         String dateString = null;  
  240. if (dateStyle != null) {  
  241.             dateString = DateToString(date, dateStyle.getValue());  
  242.         }  
  243. return dateString;  
  244.     }  
  245. /** 
  246.      * 将日期字符串转化为另一日期字符串。失败返回null。 
  247.      * @param date 旧日期字符串 
  248.      * @param newPattern 新日期格式 
  249.      * @return 新日期字符串 
  250.      */  
  251. public static String StringToString(String date, String newPattern) {  
  252.         DateStyle oldDateStyle = getDateStyle(date);  
  253. return StringToString(date, oldDateStyle, newPattern);  
  254.     }  
  255. /** 
  256.      * 将日期字符串转化为另一日期字符串。失败返回null。 
  257.      * @param date 旧日期字符串 
  258.      * @param newDateStyle 新日期风格 
  259.      * @return 新日期字符串 
  260.      */  
  261. public static String StringToString(String date, DateStyle newDateStyle) {  
  262.         DateStyle oldDateStyle = getDateStyle(date);  
  263. return StringToString(date, oldDateStyle, newDateStyle);  
  264.     }  
  265. /** 
  266.      * 将日期字符串转化为另一日期字符串。失败返回null。 
  267.      * @param date 旧日期字符串 
  268.      * @param olddPattern 旧日期格式 
  269.      * @param newPattern 新日期格式 
  270.      * @return 新日期字符串 
  271.      */  
  272. public static String StringToString(String date, String olddPattern, String newPattern) {  
  273. return DateToString(StringToDate(date, olddPattern), newPattern);  
  274.     }  
  275. /** 
  276.      * 将日期字符串转化为另一日期字符串。失败返回null。 
  277.      * @param date 旧日期字符串 
  278.      * @param olddDteStyle 旧日期风格 
  279.      * @param newParttern 新日期格式 
  280.      * @return 新日期字符串 
  281.      */  
  282. public static String StringToString(String date, DateStyle olddDteStyle, String newParttern) {  
  283.         String dateString = null;  
  284. if (olddDteStyle != null) {  
  285.             dateString = StringToString(date, olddDteStyle.getValue(), newParttern);  
  286.         }  
  287. return dateString;  
  288.     }  
  289. /** 
  290.      * 将日期字符串转化为另一日期字符串。失败返回null。 
  291.      * @param date 旧日期字符串 
  292.      * @param olddPattern 旧日期格式 
  293.      * @param newDateStyle 新日期风格 
  294.      * @return 新日期字符串 
  295.      */  
  296. public static String StringToString(String date, String olddPattern, DateStyle newDateStyle) {  
  297.         String dateString = null;  
  298. if (newDateStyle != null) {  
  299.             dateString = StringToString(date, olddPattern, newDateStyle.getValue());  
  300.         }  
  301. return dateString;  
  302.     }  
  303. /** 
  304.      * 将日期字符串转化为另一日期字符串。失败返回null。 
  305.      * @param date 旧日期字符串 
  306.      * @param olddDteStyle 旧日期风格 
  307.      * @param newDateStyle 新日期风格 
  308.      * @return 新日期字符串 
  309.      */  
  310. public static String StringToString(String date, DateStyle olddDteStyle, DateStyle newDateStyle) {  
  311.         String dateString = null;  
  312. if (olddDteStyle != null && newDateStyle != null) {  
  313.             dateString = StringToString(date, olddDteStyle.getValue(), newDateStyle.getValue());  
  314.         }  
  315. return dateString;  
  316.     }  
  317. /** 
  318.      * 增加日期的年份。失败返回null。 
  319.      * @param date 日期 
  320.      * @param yearAmount 增加数量。可为负数 
  321.      * @return 增加年份后的日期字符串 
  322.      */  
  323. public static String addYear(String date, int yearAmount) {  
  324. return addInteger(date, Calendar.YEAR, yearAmount);  
  325.     }  
  326. /** 
  327.      * 增加日期的年份。失败返回null。 
  328.      * @param date 日期 
  329.      * @param yearAmount 增加数量。可为负数 
  330.      * @return 增加年份后的日期 
  331.      */  
  332. public static Date addYear(Date date, int yearAmount) {  
  333. return addInteger(date, Calendar.YEAR, yearAmount);  
  334.     }  
  335. /** 
  336.      * 增加日期的月份。失败返回null。 
  337.      * @param date 日期 
  338.      * @param monthAmount 增加数量。可为负数 
  339.      * @return 增加月份后的日期字符串 
  340.      */  
  341. public static String addMonth(String date, int monthAmount) {  
  342. return addInteger(date, Calendar.MONTH, monthAmount);  
  343.     }  
  344. /** 
  345.      * 增加日期的月份。失败返回null。 
  346.      * @param date 日期 
  347.      * @param monthAmount 增加数量。可为负数 
  348.      * @return 增加月份后的日期 
  349.      */  
  350. public static Date addMonth(Date date, int monthAmount) {  
  351. return addInteger(date, Calendar.MONTH, monthAmount);  
  352.     }  
  353. /** 
  354.      * 增加日期的天数。失败返回null。 
  355.      * @param date 日期字符串 
  356.      * @param dayAmount 增加数量。可为负数 
  357.      * @return 增加天数后的日期字符串 
  358.      */  
  359. public static String addDay(String date, int dayAmount) {  
  360. return addInteger(date, Calendar.DATE, dayAmount);  
  361.     }  
  362. /** 
  363.      * 增加日期的天数。失败返回null。 
  364.      * @param date 日期 
  365.      * @param dayAmount 增加数量。可为负数 
  366.      * @return 增加天数后的日期 
  367.      */  
  368. public static Date addDay(Date date, int dayAmount) {  
  369. return addInteger(date, Calendar.DATE, dayAmount);  
  370.     }  
  371. /** 
  372.      * 增加日期的小时。失败返回null。 
  373.      * @param date 日期字符串 
  374.      * @param hourAmount 增加数量。可为负数 
  375.      * @return 增加小时后的日期字符串 
  376.      */  
  377. public static String addHour(String date, int hourAmount) {  
  378. return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);  
  379.     }  
  380. /** 
  381.      * 增加日期的小时。失败返回null。 
  382.      * @param date 日期 
  383.      * @param hourAmount 增加数量。可为负数 
  384.      * @return 增加小时后的日期 
  385.      */  
  386. public static Date addHour(Date date, int hourAmount) {  
  387. return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);  
  388.     }  
  389. /** 
  390.      * 增加日期的分钟。失败返回null。 
  391.      * @param date 日期字符串 
  392.      * @param minuteAmount 增加数量。可为负数 
  393.      * @return 增加分钟后的日期字符串 
  394.      */  
  395. public static String addMinute(String date, int minuteAmount) {  
  396. return addInteger(date, Calendar.MINUTE, minuteAmount);  
  397.     }  
  398. /** 
  399.      * 增加日期的分钟。失败返回null。 
  400.      * @param date 日期 
  401.      * @param dayAmount 增加数量。可为负数 
  402.      * @return 增加分钟后的日期 
  403.      */  
  404. public static Date addMinute(Date date, int minuteAmount) {  
  405. return addInteger(date, Calendar.MINUTE, minuteAmount);  
  406.     }  
  407. /** 
  408.      * 增加日期的秒钟。失败返回null。 
  409.      * @param date 日期字符串 
  410.      * @param dayAmount 增加数量。可为负数 
  411.      * @return 增加秒钟后的日期字符串 
  412.      */  
  413. public static String addSecond(String date, int secondAmount) {  
  414. return addInteger(date, Calendar.SECOND, secondAmount);  
  415.     }  
  416. /** 
  417.      * 增加日期的秒钟。失败返回null。 
  418.      * @param date 日期 
  419.      * @param dayAmount 增加数量。可为负数 
  420.      * @return 增加秒钟后的日期 
  421.      */  
  422. public static Date addSecond(Date date, int secondAmount) {  
  423. return addInteger(date, Calendar.SECOND, secondAmount);  
  424.     }  
  425. /** 
  426.      * 获取日期的年份。失败返回0。 
  427.      * @param date 日期字符串 
  428.      * @return 年份 
  429.      */  
  430. public static int getYear(String date) {  
  431. return getYear(StringToDate(date));  
  432.     }  
  433. /** 
  434.      * 获取日期的年份。失败返回0。 
  435.      * @param date 日期 
  436.      * @return 年份 
  437.      */  
  438. public static int getYear(Date date) {  
  439. return getInteger(date, Calendar.YEAR);  
  440.     }  
  441. /** 
  442.      * 获取日期的月份。失败返回0。 
  443.      * @param date 日期字符串 
  444.      * @return 月份 
  445.      */  
  446. public static int getMonth(String date) {  
  447. return getMonth(StringToDate(date));  
  448.     }  
  449. /** 
  450.      * 获取日期的月份。失败返回0。 
  451.      * @param date 日期 
  452.      * @return 月份 
  453.      */  
  454. public static int getMonth(Date date) {  
  455. return getInteger(date, Calendar.MONTH) + 1;  
  456.     }  
  457. /** 
  458.      * 获取日期的天数。失败返回0。 
  459.      * @param date 日期字符串 
  460.      * @return 天 
  461.      */  
  462. public static int getDay(String date) {  
  463. return getDay(StringToDate(date));  
  464.     }  
  465. /** 
  466.      * 获取日期的天数。失败返回0。 
  467.      * @param date 日期 
  468.      * @return 天 
  469.      */  
  470. public static int getDay(Date date) {  
  471. return getInteger(date, Calendar.DATE);  
  472.     }  
  473. /** 
  474.      * 获取日期的小时。失败返回0。 
  475.      * @param date 日期字符串 
  476.      * @return 小时 
  477.      */  
  478. public static int getHour(String date) {  
  479. return getHour(StringToDate(date));  
  480.     }  
  481. /** 
  482.      * 获取日期的小时。失败返回0。 
  483.      * @param date 日期 
  484.      * @return 小时 
  485.      */  
  486. public static int getHour(Date date) {  
  487. return getInteger(date, Calendar.HOUR_OF_DAY);  
  488.     }  
  489. /** 
  490.      * 获取日期的分钟。失败返回0。 
  491.      * @param date 日期字符串 
  492.      * @return 分钟 
  493.      */  
  494. public static int getMinute(String date) {  
  495. return getMinute(StringToDate(date));  
  496.     }  
  497. /** 
  498.      * 获取日期的分钟。失败返回0。 
  499.      * @param date 日期 
  500.      * @return 分钟 
  501.      */  
  502. public static int getMinute(Date date) {  
  503. return getInteger(date, Calendar.MINUTE);  
  504.     }  
  505. /** 
  506.      * 获取日期的秒钟。失败返回0。 
  507.      * @param date 日期字符串 
  508.      * @return 秒钟 
  509.      */  
  510. public static int getSecond(String date) {  
  511. return getSecond(StringToDate(date));  
  512.     }  
  513. /** 
  514.      * 获取日期的秒钟。失败返回0。 
  515.      * @param date 日期 
  516.      * @return 秒钟 
  517.      */  
  518. public static int getSecond(Date date) {  
  519. return getInteger(date, Calendar.SECOND);  
  520.     }  
  521. /** 
  522.      * 获取日期 。默认yyyy-MM-dd格式。失败返回null。 
  523.      * @param date 日期字符串 
  524.      * @return 日期 
  525.      */  
  526. public static String getDate(String date) {  
  527. return StringToString(date, DateStyle.YYYY_MM_DD);  
  528.     }  
  529. /** 
  530.      * 获取日期。默认yyyy-MM-dd格式。失败返回null。 
  531.      * @param date 日期 
  532.      * @return 日期 
  533.      */  
  534. public static String getDate(Date date) {  
  535. return DateToString(date, DateStyle.YYYY_MM_DD);  
  536.     }  
  537. /** 
  538.      * 获取日期的时间。默认HH:mm:ss格式。失败返回null。 
  539.      * @param date 日期字符串 
  540.      * @return 时间 
  541.      */  
  542. public static String getTime(String date) {  
  543. return StringToString(date, DateStyle.HH_MM_SS);  
  544.     }  
  545. /** 
  546.      * 获取日期的时间。默认HH:mm:ss格式。失败返回null。 
  547.      * @param date 日期 
  548.      * @return 时间 
  549.      */  
  550. public static String getTime(Date date) {  
  551. return DateToStr

    以上是关于java日期工具类DateUtil的主要内容,如果未能解决你的问题,请参考以下文章

    制作工具类DateUtil

    3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容

    4hutool源码分析:DateUtil(时间工具类)-格式化时间(万字长文源码分析,学大佬如何写代码)

    4hutool源码分析:DateUtil(时间工具类)-格式化时间(万字长文源码分析,学大佬如何写代码)

    3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容

    3hutool源码分析:DateUtil(时间工具类)-获取日期的各种内容