DateUtils.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. package com.zanxiang.common.utils;
  2. import org.apache.commons.lang.time.DateFormatUtils;
  3. import java.lang.management.ManagementFactory;
  4. import java.text.DateFormat;
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.time.*;
  8. import java.time.format.DateTimeFormatter;
  9. import java.time.temporal.ChronoUnit;
  10. import java.time.temporal.TemporalAccessor;
  11. import java.util.ArrayList;
  12. import java.util.Date;
  13. import java.util.List;
  14. import java.util.Locale;
  15. /**
  16. * 时间工具类
  17. *
  18. * @author ruoyi
  19. */
  20. public class DateUtils extends org.apache.commons.lang.time.DateUtils {
  21. public static String YYYY_MM_DD = "yyyy-MM-dd";
  22. public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
  23. public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
  24. private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
  25. public static final DateTimeFormatter FORMAT_DATETIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  26. public static final DateTimeFormatter FORMAT_FOR_KEY = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm");
  27. public static final DateTimeFormatter FORMAT_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  28. public static final DateTimeFormatter FORMAT_TIME = DateTimeFormatter.ofPattern("HH:mm:ss");
  29. public static long localDateToSecond(LocalDate localDate) {
  30. return localDate.atStartOfDay(ZoneOffset.ofHours(8)).toEpochSecond();
  31. }
  32. public static long localDateToMilli(LocalDate localDate) {
  33. return localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
  34. }
  35. public static Date localDateToDate(LocalDate localDate) {
  36. return Date.from(localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant());
  37. }
  38. public static LocalDateTime localDateToLocalDateTime(LocalDate localDate) {
  39. return LocalDateTime.of(localDate, LocalTime.MIN);
  40. }
  41. public static long localDateTimeToSecond(LocalDateTime localDateTime) {
  42. return localDateTime.toEpochSecond(ZoneOffset.ofHours(8));
  43. }
  44. public static long localDateTimeToMilli(LocalDateTime localDateTime) {
  45. return localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
  46. }
  47. public static Date localDateTimeToDate(LocalDateTime localDateTime) {
  48. return Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
  49. }
  50. public static LocalDate secondToLocalDate(long second) {
  51. return Instant.ofEpochSecond(second).atZone(ZoneOffset.ofHours(8)).toLocalDate();
  52. }
  53. public static LocalDate milliToLocalDate(long milli) {
  54. return Instant.ofEpochMilli(milli).atZone(ZoneOffset.ofHours(8)).toLocalDate();
  55. }
  56. public static long milliToSecond(long milli) {
  57. return milli / 1000;
  58. }
  59. public static int milliToSecond2(long milli) {
  60. return ((Long) (milli / 1000)).intValue();
  61. }
  62. public static boolean equals(LocalDateTime date1, LocalDateTime date2) {
  63. if (date1 == null && date2 == null) {
  64. return true;
  65. }
  66. if (date1 == null || date2 == null) {
  67. return false;
  68. }
  69. return date1.compareTo(date2) == 0;
  70. }
  71. public static boolean equals(LocalDate date1, LocalDate date2) {
  72. if (date1 == null && date2 == null) {
  73. return true;
  74. }
  75. if (date1 == null || date2 == null) {
  76. return false;
  77. }
  78. return date1.compareTo(date2) == 0;
  79. }
  80. public static LocalDateTime secondToLocalDateTime(long second) {
  81. return Instant.ofEpochSecond(second).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
  82. }
  83. public static long secondToMilli(int second) {
  84. return second * 1000;
  85. }
  86. public static long secondToMilli(long second) {
  87. return second * 1000;
  88. }
  89. public static LocalDateTime milliToLocalDateTime(long milli) {
  90. return Instant.ofEpochMilli(milli).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
  91. }
  92. public static LocalDate dateToLocalDate(Date date) {
  93. return date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDate();
  94. }
  95. public static LocalDateTime dateToLocalDateTime(Date date) {
  96. return date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
  97. }
  98. public static String format(TemporalAccessor temporal, DateTimeFormatter formatter) {
  99. return formatter.format(temporal);
  100. }
  101. public static String formatLocalDate(LocalDate localDate) {
  102. return FORMAT_DATE.format(localDate);
  103. }
  104. public static String formatLocalDateTime(LocalDateTime localDateTime) {
  105. return FORMAT_DATETIME.format(localDateTime);
  106. }
  107. /**
  108. * 2个日期的时间间隔
  109. *
  110. * @param beginDate
  111. * @param endDate
  112. * @return
  113. */
  114. public static long intervalOfDays(LocalDate beginDate, LocalDate endDate) {
  115. return endDate.toEpochDay() - beginDate.toEpochDay();
  116. }
  117. /**
  118. * 2个日期的时间间隔
  119. *
  120. * @param beginDate
  121. * @param endDate
  122. * @return
  123. */
  124. public static long intervalOfHour(LocalDateTime beginDate, LocalDateTime endDate) {
  125. return ChronoUnit.HOURS.between(beginDate, endDate);
  126. }
  127. /**
  128. * 2个日期的时间间隔
  129. *
  130. * @param beginDate
  131. * @param endDate
  132. * @return
  133. */
  134. public static long intervalOfMinute(LocalDateTime beginDate, LocalDateTime endDate) {
  135. return ChronoUnit.MINUTES.between(beginDate, endDate);
  136. }
  137. public static List<LocalDate> splitByWeek(LocalDate startLocalDate, LocalDate endLocalDate) {
  138. if (startLocalDate.compareTo(endLocalDate) > 0) {
  139. throw new RuntimeException("startLocalDate must be less than endLocalDate");
  140. }
  141. List<LocalDate> localDates = new ArrayList<>();
  142. LocalDate lastMonday = startLocalDate.with(DayOfWeek.MONDAY).plusDays(7);// 下周一
  143. do {
  144. localDates.add(startLocalDate);
  145. startLocalDate = lastMonday;
  146. lastMonday = lastMonday.plusDays(7);
  147. } while (startLocalDate.compareTo(endLocalDate) < 0);
  148. localDates.add(endLocalDate);
  149. return localDates;
  150. }
  151. /**
  152. * 将时间段按照月份切割
  153. * <p>
  154. * ex:2020-01-30 ~ 2020-01-30 => ["2020-01-30","2020-01-30"]
  155. * ex:2020-01-30 ~ 2020-02-01 => ["2020-01-30","2020-02-01"]
  156. * ex:2020-01-30 ~ 2020-03-03 => ["2020-01-30","2020-02-01","2020-03-01","2020-03-03"]
  157. *
  158. * @param startLocalDate
  159. * @param endLocalDate
  160. * @return
  161. */
  162. public static List<LocalDate> splitByMonth(LocalDate startLocalDate, LocalDate endLocalDate) {
  163. if (startLocalDate.compareTo(endLocalDate) > 0) {
  164. throw new RuntimeException("startLocalDate must be less than endLocalDate");
  165. }
  166. List<LocalDate> localDates = new ArrayList<>();
  167. LocalDate lastMonth = startLocalDate.withDayOfMonth(1).plusMonths(1);// 下月 1号
  168. do {
  169. localDates.add(startLocalDate);
  170. startLocalDate = lastMonth;
  171. lastMonth = startLocalDate.plusMonths(1);
  172. } while (startLocalDate.compareTo(endLocalDate) < 0);
  173. localDates.add(endLocalDate);
  174. return localDates;
  175. }
  176. /**
  177. * 将时间段按天切割
  178. *
  179. * @param startLocalDate
  180. * @param endLocalDate
  181. * @return
  182. */
  183. public static List<LocalDate> splitByDay(LocalDate startLocalDate, LocalDate endLocalDate) {
  184. if (startLocalDate.compareTo(endLocalDate) > 0) {
  185. throw new RuntimeException("startLocalDate must be less than endLocalDate");
  186. }
  187. List<LocalDate> localDates = new ArrayList<>();
  188. long day = endLocalDate.toEpochDay() - startLocalDate.toEpochDay();
  189. for (int i = 0; i <= day; i++) {
  190. localDates.add(startLocalDate.plusDays(i));
  191. }
  192. return localDates;
  193. }
  194. /**
  195. * 获取指定年月的天数
  196. *
  197. * @param year
  198. * @param month
  199. * @return
  200. */
  201. public static long daysOfYearMonth(int year, int month) {
  202. LocalDate start = LocalDate.of(year, month, 1);
  203. if (month == 12) {
  204. year += 1;
  205. month = 1;
  206. } else {
  207. month += 1;
  208. }
  209. LocalDate end = LocalDate.of(year, month, 1);
  210. return intervalOfDays(start, end);
  211. }
  212. public String localDateFormat(LocalDate localDate, String formatStr) {
  213. return localDate.format(DateTimeFormatter.ofPattern(formatStr));
  214. }
  215. public String localDateFormat(LocalDate localDate, DateTimeFormatter formatter) {
  216. return localDate.format(formatter);
  217. }
  218. /**
  219. * 获取当前日期, 默认格式为yyyy-MM-dd
  220. *
  221. * @return String
  222. */
  223. public static String getDate() {
  224. return dateTimeNow(YYYY_MM_DD);
  225. }
  226. public static final String getTime() {
  227. return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
  228. }
  229. public static final String dateTimeNow() {
  230. return dateTimeNow(YYYYMMDDHHMMSS);
  231. }
  232. public static final String dateTimeNow(final String format) {
  233. return parseDateToStr(format, new Date());
  234. }
  235. public static final String dateTime(final Date date) {
  236. return parseDateToStr(YYYY_MM_DD, date);
  237. }
  238. public static final String parseDateToStr(final String format, final Date date) {
  239. return new SimpleDateFormat(format).format(date);
  240. }
  241. public static final Date dateTime(final String format, final String ts) {
  242. try {
  243. return new SimpleDateFormat(format).parse(ts);
  244. } catch (ParseException e) {
  245. throw new RuntimeException(e);
  246. }
  247. }
  248. /**
  249. * 日期路径 即年/月/日 如2018/08/08
  250. */
  251. public static final String datePath() {
  252. Date now = new Date();
  253. return DateFormatUtils.format(now, "yyyy/MM/dd");
  254. }
  255. /**
  256. * 日期路径 即年/月/日 如20180808
  257. */
  258. public static final String dateTime() {
  259. Date now = new Date();
  260. return DateFormatUtils.format(now, "yyyyMMdd");
  261. }
  262. /**
  263. * 日期型字符串转化为日期 格式
  264. */
  265. public static Date parseDate(Object str) {
  266. if (str == null) {
  267. return null;
  268. }
  269. try {
  270. return parseDate(str.toString(), parsePatterns);
  271. } catch (ParseException e) {
  272. return null;
  273. }
  274. }
  275. /**
  276. * 获取服务器启动时间
  277. */
  278. public static Date getServerStartDate() {
  279. long time = ManagementFactory.getRuntimeMXBean().getStartTime();
  280. return new Date(time);
  281. }
  282. /**
  283. * 计算两个时间差
  284. */
  285. public static String getDatePoor(Date endDate, Date nowDate) {
  286. long nd = 1000 * 24 * 60 * 60;
  287. long nh = 1000 * 60 * 60;
  288. long nm = 1000 * 60;
  289. // long ns = 1000;
  290. // 获得两个时间的毫秒时间差异
  291. long diff = endDate.getTime() - nowDate.getTime();
  292. // 计算差多少天
  293. long day = diff / nd;
  294. // 计算差多少小时
  295. long hour = diff % nd / nh;
  296. // 计算差多少分钟
  297. long min = diff % nd % nh / nm;
  298. // 计算差多少秒//输出结果
  299. // long sec = diff % nd % nh % nm / ns;
  300. return day + "天" + hour + "小时" + min + "分钟";
  301. }
  302. /**
  303. * String转换成LocalDate,标准时间字符串
  304. *
  305. * @param date "2021-01-01"
  306. * @return
  307. */
  308. public static LocalDateTime string2LocalDate(String date) {
  309. DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  310. return LocalDateTime.parse(date, fmt);
  311. }
  312. /**
  313. * 特殊日期字符串处理
  314. *
  315. * @param dateTime “2021-01-01T00:00:00+08:00”
  316. * @return
  317. */
  318. public static LocalDateTime string2LocalDateTime(String dateTime) throws ParseException {
  319. DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
  320. Date date = df.parse(dateTime);
  321. SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.UK);
  322. date = sdf.parse(date.toString());
  323. df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  324. return string2LocalDate(df.format(date));
  325. }
  326. /**
  327. * 获得某天最小时间 2020-08-19 00:00:00
  328. *
  329. * @param oneDayTime : 某天的时间
  330. * @return : 返回某天零点时间13位时间戳
  331. */
  332. public static long getStartOfDay(Long oneDayTime) {
  333. LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(oneDayTime), ZoneId.systemDefault());
  334. LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);
  335. return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()).getTime();
  336. }
  337. /**
  338. * 获得某天最大时间 2021-08-19 23:59:59
  339. *
  340. * @param oneDayTime : 某天的时间
  341. * @return : 返回某天23:59:59的13位时间戳
  342. */
  343. public static long getEndOfDay(Long oneDayTime) {
  344. LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(oneDayTime), ZoneId.systemDefault());
  345. LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
  346. return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()).getTime();
  347. }
  348. }