DateUtils.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. package com.kmall.common.utils;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.apache.log4j.Logger;
  5. import org.springframework.util.StringUtils;
  6. import java.math.BigDecimal;
  7. import java.text.ParseException;
  8. import java.text.SimpleDateFormat;
  9. import java.util.Calendar;
  10. import java.util.Date;
  11. import java.util.Locale;
  12. /**
  13. * 日期处理
  14. *
  15. * @author Scott
  16. * @email
  17. * @date 2016年12月21日 下午12:53:33
  18. */
  19. public class DateUtils {
  20. // 日志
  21. private static final Log logger = LogFactory.getLog(DateUtils.class);
  22. /**
  23. * 时间格式(yyyy-MM-dd)
  24. */
  25. public final static String DATE_PATTERN = "yyyy-MM-dd";
  26. public static String DATE_TIME_PATTERN_YYYY_MM_DD = "yyyyMMdd";
  27. /**
  28. * 无分隔符日期格式 "yyyyMMddHHmmss"
  29. */
  30. public static String DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS = "yyyyMMddHHmmss";
  31. /**
  32. * 无分隔符日期格式 "yyyyMMddHHmmssSSS"
  33. */
  34. public static String DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS_SSS = "yyyyMMddHHmmssSSS";
  35. /**
  36. * 不带秒的标准日期格式 "yyyy.MM.dd HH:mm"
  37. */
  38. public static String PATTERN_YYYY_MM_DD_HH_MM = "yyyy.MM.dd HH:mm";
  39. /**
  40. * 时间格式(yyyy-MM-dd HH:mm:ss)
  41. */
  42. public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
  43. // 日期转换格式数组
  44. public static String[][] regularExp = new String[][]{
  45. // 默认格式
  46. {"\\d{4}-((([0][1,3-9]|[1][0-2]|[1-9])-([0-2]\\d|[3][0,1]|[1-9]))|((02|2)-(([1-9])|[0-2]\\d)))\\s+([0,1]\\d|[2][0-3]|\\d):([0-5]\\d|\\d):([0-5]\\d|\\d)",
  47. DATE_TIME_PATTERN},
  48. // 仅日期格式 年月日 时 分 秒
  49. {"\\d{4}.((([0][1,3-9]|[1][0-2]|[1-9]).([0-2]\\d|[3][0,1]|[1-9]))|((02|2).(([1-9])|[0-2]\\d)))\\s+([0,1]\\d|[2][0-3]|\\d):([0-5]\\d|\\d)",
  50. PATTERN_YYYY_MM_DD_HH_MM},
  51. // 仅日期格式 年月日
  52. {"\\d{4}-((([0][1,3-9]|[1][0-2]|[1-9])-([0-2]\\d|[3][0,1]|[1-9]))|((02|2)-(([1-9])|[0-2]\\d)))",
  53. DATE_PATTERN},
  54. // 带毫秒格式
  55. {"\\d{4}((([0][1,3-9]|[1][0-2]|[1-9])([0-2]\\d|[3][0,1]|[1-9]))|((02|2)(([1-9])|[0-2]\\d)))([0,1]\\d|[2][0-3])([0-5]\\d|\\d)([0-5]\\d|\\d)\\d{1,3}",
  56. DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS_SSS}
  57. };
  58. public static String format(Date date) {
  59. return format(date, DATE_PATTERN);
  60. }
  61. public static String format(Date date, String pattern) {
  62. if (date != null) {
  63. SimpleDateFormat df = new SimpleDateFormat(pattern);
  64. return df.format(date);
  65. }
  66. return null;
  67. }
  68. public static String timeToStr(Long time, String pattern) {
  69. SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
  70. if (time.toString().length() < 13) {
  71. time = time * 1000L;
  72. }
  73. Date date = new Date(time);
  74. String value = dateFormat.format(date);
  75. return value;
  76. }
  77. public static long strToTime(String timeStr) {
  78. Date time = strToDate(timeStr);
  79. return time.getTime() / 1000;
  80. }
  81. /**
  82. * 获取过去的分钟
  83. *
  84. * @param date
  85. * @return
  86. */
  87. public static long pastMinutes(Date date) {
  88. long t = new Date().getTime() - date.getTime();
  89. return t / (60 * 1000);
  90. }
  91. /**
  92. * 转换为时间类型格式
  93. *
  94. * @param strDate 日期
  95. * @return
  96. */
  97. public static Date strToDate(String strDate) {
  98. try {
  99. String strType = getDateFormat(strDate);
  100. SimpleDateFormat sf = new SimpleDateFormat(strType);
  101. return new Date((sf.parse(strDate).getTime()));
  102. } catch (Exception e) {
  103. return null;
  104. }
  105. }
  106. /**
  107. * 根据传入的日期格式字符串,获取日期的格式
  108. *
  109. * @return 秒
  110. */
  111. public static String getDateFormat(String date_str) {
  112. String style = null;
  113. if (StringUtils.isEmpty(date_str)) {
  114. return null;
  115. }
  116. boolean b = false;
  117. for (int i = 0; i < regularExp.length; i++) {
  118. b = date_str.matches(regularExp[i][0]);
  119. if (b) {
  120. style = regularExp[i][1];
  121. }
  122. }
  123. if (StringUtils.isEmpty(style)) {
  124. logger.info("date_str:" + date_str);
  125. logger.info("日期格式获取出错,未识别的日期格式");
  126. }
  127. return style;
  128. }
  129. /**
  130. * 将字符串类型的转换成Date类型
  131. *
  132. * @param dateStr 字符串类型的日期 yyyy-MM-dd
  133. * @return Date类型的日期
  134. * @throws ParseException
  135. */
  136. public static Date convertStringToDate(String dateStr,String format) {
  137. // 返回的日期
  138. Date resultDate = null;
  139. try {
  140. // 日期格式转换
  141. SimpleDateFormat sdf = new SimpleDateFormat(format);
  142. resultDate = sdf.parse(dateStr);
  143. } catch (ParseException e) {
  144. e.printStackTrace();
  145. }
  146. return resultDate;
  147. }
  148. /**
  149. * 获取月份的开始和结束时间
  150. *
  151. * @param time
  152. */
  153. public static Date[] getMonthStartEnd(Date time) {
  154. Date[] startEndDate = new Date[2];
  155. // 获取当前月第一天
  156. Calendar cal = Calendar.getInstance();// 获取当前日期
  157. cal.setTime(time);
  158. cal.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
  159. cal.set(Calendar.HOUR_OF_DAY, 0);
  160. cal.set(Calendar.MINUTE, 0);
  161. cal.set(Calendar.SECOND, 0);
  162. cal.set(Calendar.MILLISECOND, 0);
  163. startEndDate[0] = cal.getTime();
  164. cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
  165. cal.set(Calendar.HOUR_OF_DAY, 23);
  166. cal.set(Calendar.MINUTE, 59);
  167. cal.set(Calendar.SECOND, 59);
  168. cal.set(Calendar.MILLISECOND, 999);
  169. startEndDate[1] = cal.getTime();
  170. return startEndDate;
  171. }
  172. public static String getDate(String datdString){
  173. datdString = datdString.replace("GMT", "").replaceAll("\\(.*\\)", "");
  174. //将字符串转化为date类型,格式2016-10-12
  175. SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss z", Locale.ENGLISH);
  176. Date dateTrans = null;
  177. try {
  178. dateTrans = format.parse(datdString);
  179. return new SimpleDateFormat("yyyy-MM-dd").format(dateTrans);
  180. } catch (ParseException e) {
  181. e.printStackTrace();
  182. }
  183. return datdString;
  184. }
  185. /**
  186. * true为开始时间小于或等于结束时间,false为开始时间大于结束时间
  187. * @param startDate
  188. * @param endDate
  189. * @return
  190. */
  191. public static Boolean compareDate(Date startDate, Date endDate) {
  192. // System.out.println(startDate.compareTo(endDate));
  193. if(startDate.compareTo(endDate) == 0){
  194. return true;
  195. }
  196. if (startDate.getTime() > endDate.getTime()) {
  197. return false;
  198. }
  199. return true;
  200. }
  201. public static Date addDay(Date date, Integer day){
  202. Date d = new Date();
  203. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  204. String currdate = format.format(d);
  205. // System.out.println("现在的日期是:" + currdate);
  206. Calendar ca = Calendar.getInstance();
  207. ca.setTime(date);
  208. ca.add(Calendar.DATE, day);// num为增加的天数,可以改变的
  209. d = ca.getTime();
  210. String enddate = format.format(d);
  211. // System.out.println("增加天数以后的日期:" + enddate);
  212. return d;
  213. }
  214. public static String addMin(Date date, Integer min){
  215. SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
  216. Calendar ca = Calendar.getInstance();
  217. ca.setTime(date);
  218. ca.add(Calendar.MINUTE, min);// min为增加的分钟数,可以改变的
  219. Date d = ca.getTime();
  220. String enddate = format.format(d);
  221. return enddate;
  222. }
  223. public static void main(String[] args) {
  224. // Date date = new Date();
  225. // String str = "20170818223629599";
  226. // System.out.println(DateUtils.getDateFormat(str));
  227. // System.out.println(DateUtils.addDay(2));
  228. System.out.println(DateUtils.compareDate(new Date(), new Date()));
  229. System.out.println(new BigDecimal("11").compareTo(new BigDecimal("11")));
  230. System.out.println(BigDecimal.valueOf(Double.valueOf("0.112")));
  231. }
  232. /**
  233. * 获取date的日期和time的时间 组成的新的日期对象
  234. *
  235. * @return
  236. */
  237. public static Date getDateAddTime(String d1, String d2) {
  238. Date allDate = parseToDate(d1 + " " + d2, "yyyy-MM-dd HH:mm:ss");
  239. return allDate;
  240. }
  241. /**
  242. * @desc:String转date
  243. * @author Clyde
  244. * @date:2014-3-16
  245. * @param strDate
  246. * @param format
  247. * @return 若失败则返回当前时间
  248. */
  249. public static Date parseToDate(String strDate, String format) {
  250. try {
  251. if (strDate == null || strDate.trim().length() == 0) {
  252. return new Date();
  253. }
  254. SimpleDateFormat sdf = new SimpleDateFormat(format);
  255. return sdf.parse(strDate);
  256. } catch (ParseException e) {
  257. logger.error("[ERROR:时间转换失败;]", e);
  258. return new Date();
  259. }
  260. }
  261. /**
  262. * @desc:格式化日期
  263. * @author Clyde
  264. * @date:2014-2-23
  265. * @param date
  266. * @param format
  267. * @return
  268. */
  269. public static String formatDate(Date date, String format) {
  270. String customDate = "";
  271. if (date != null) {
  272. SimpleDateFormat sdf = new SimpleDateFormat(format);
  273. customDate = sdf.format(date);
  274. }
  275. return customDate;
  276. }
  277. public static Date add(int field, Date date, int value) {
  278. if (value == 0) {
  279. return date;
  280. }
  281. Calendar c = Calendar.getInstance();
  282. c.setTime(date);
  283. int fieldNewValue = c.get(field) + value;
  284. c.set(field, fieldNewValue);
  285. return c.getTime();
  286. }
  287. /**
  288. * 加减日
  289. * @param date
  290. * @param value
  291. * @return
  292. */
  293. public static Date addDate(Date date, int value){
  294. return add(Calendar.DATE,date,value);
  295. }
  296. }