DateTimeUtil.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. package com.ydtech.utils;
  2. import cn.hutool.core.collection.CollUtil;
  3. import java.text.ParseException;
  4. import java.text.SimpleDateFormat;
  5. import java.time.*;
  6. import java.time.format.DateTimeFormatter;
  7. import java.time.temporal.ChronoField;
  8. import java.time.temporal.ChronoUnit;
  9. import java.time.temporal.TemporalAccessor;
  10. import java.time.temporal.TemporalAdjusters;
  11. import java.util.*;
  12. /**
  13. * 日期时间工具类 后期替换DateUtil工具类
  14. *
  15. * @author lig
  16. */
  17. public class DateTimeUtil {
  18. /**
  19. * 显示年月日时分秒,例如 2015-08-11 09:51:53.
  20. */
  21. public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
  22. /**
  23. * 显示年月日时分,例如 2015-08-11 09:51.
  24. */
  25. public static final String DATETIME_PATTERN_EXT1 = "yyyy-MM-dd HH:mm";
  26. /**
  27. * 仅显示年月日,例如 2015-08-11.
  28. */
  29. public static final String DATE_PATTERN = "yyyy-MM-dd";
  30. /**
  31. * 仅显示时分秒,例如 09:51:53.
  32. */
  33. public static final String TIME_PATTERN = "HH:mm:ss";
  34. /**
  35. * 显示年月日时分秒(无符号),例如 20150811095153.
  36. */
  37. public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss";
  38. /**
  39. * 显示年月日时分秒(无符号) 扩展1,例如 201508110951.
  40. */
  41. public static final String UNSIGNED_DATETIME_PATTERN_EXT1 = "yyyyMMddHHmm";
  42. /**
  43. * 仅显示年月日(无符号),例如 20150811.
  44. */
  45. public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";
  46. /**
  47. * 获取当前日期和时间字符串.
  48. *
  49. * @return String 日期时间字符串,例如 2015-08-11 09:51:53
  50. */
  51. public static String getLocalDateTimeStr() {
  52. return format(LocalDateTime.now(), DATETIME_PATTERN);
  53. }
  54. /**
  55. * 获取当前日期字符串.
  56. *
  57. * @return String 日期字符串,例如2015-08-11
  58. */
  59. public static String getLocalDateStr() {
  60. return format(LocalDate.now(), DATE_PATTERN);
  61. }
  62. /**
  63. * 获取当前时间字符串.
  64. *
  65. * @return String 时间字符串,例如 09:51:53
  66. */
  67. public static String getLocalTimeStr() {
  68. return format(LocalTime.now(), TIME_PATTERN);
  69. }
  70. /**
  71. * 获取当前星期字符串.
  72. *
  73. * @return String 当前星期字符串,例如 星期二
  74. */
  75. public static String getDayOfWeekStr() {
  76. return format(LocalDate.now(), "E");
  77. }
  78. /**
  79. * 获取日期时间字符串
  80. *
  81. * @param temporal 需要转化的日期时间
  82. * @param pattern 时间格式
  83. * @return String 日期时间字符串,例如 2015-08-11 09:51:53
  84. */
  85. public static String format(TemporalAccessor temporal, String pattern) {
  86. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
  87. return dateTimeFormatter.format(temporal);
  88. }
  89. /**
  90. * 日期时间字符串转换为日期时间(java.time.LocalDateTime)
  91. *
  92. * @param localDateTimeStr 日期时间字符串
  93. * @param pattern 日期时间格式 例如DATETIME_PATTERN
  94. * @return LocalDateTime 日期时间
  95. */
  96. public static LocalDateTime parseLocalDateTime(String localDateTimeStr, String pattern) {
  97. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
  98. return LocalDateTime.parse(localDateTimeStr, dateTimeFormatter);
  99. }
  100. /**
  101. * 日期字符串转换为日期(java.time.LocalDate)
  102. *
  103. * @param localDateStr 日期字符串
  104. * @param pattern 日期格式 例如DATE_PATTERN
  105. * @return LocalDate 日期
  106. */
  107. public static LocalDate parseLocalDate(String localDateStr, String pattern) {
  108. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
  109. return LocalDate.parse(localDateStr, dateTimeFormatter);
  110. }
  111. /**
  112. * 日期字符串转换为 日期字符串
  113. *
  114. * @param localDateStr 日期字符串
  115. * @param pattern 日期格式 例如DATE_PATTERN
  116. * @return String 日期
  117. */
  118. public static String parseLocalDateToString(String localDateStr, String pattern) {
  119. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
  120. return LocalDate.parse(localDateStr, dateTimeFormatter).toString();
  121. }
  122. /**
  123. * 日期字符串转换为 日期字符串 前一天
  124. *
  125. * @param localDateStr 日期字符串
  126. * @param pattern 日期格式 例如DATE_PATTERN
  127. * @return String 日期
  128. */
  129. public static String parseLocalDateToStringFrontOne(String localDateStr, String pattern) {
  130. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
  131. LocalDate date = LocalDate.parse(localDateStr,dateTimeFormatter);
  132. LocalDate yesterday = date.plusDays(-1);
  133. return yesterday.toString();
  134. }
  135. /**
  136. * 获取指定日期时间加上指定数量日期时间单位之后的日期时间.
  137. *
  138. * @param localDateTime 日期时间
  139. * @param num 数量
  140. * @param chronoUnit 日期时间单位
  141. * @return LocalDateTime 新的日期时间
  142. */
  143. public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
  144. return localDateTime.plus(num, chronoUnit);
  145. }
  146. /**
  147. * 获取指定日期时间减去指定数量日期时间单位之后的日期时间.
  148. *
  149. * @param localDateTime 日期时间
  150. * @param num 数量
  151. * @param chronoUnit 日期时间单位
  152. * @return LocalDateTime 新的日期时间
  153. */
  154. public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
  155. return localDateTime.minus(num, chronoUnit);
  156. }
  157. /**
  158. * 根据ChronoUnit计算两个日期时间之间相隔日期时间
  159. *
  160. * @param start 开始日期时间
  161. * @param end 结束日期时间
  162. * @param chronoUnit 日期时间单位
  163. * @return long 相隔日期时间
  164. */
  165. public static long getChronoUnitBetween(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) {
  166. return Math.abs(start.until(end, chronoUnit));
  167. }
  168. /**
  169. * 根据ChronoUnit计算两个日期之间相隔年数或月数或天数
  170. *
  171. * @param start 开始日期
  172. * @param end 结束日期
  173. * @param chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS)
  174. * @return long 相隔年数或月数或天数
  175. */
  176. public static long getChronoUnitBetween(LocalDate start, LocalDate end, ChronoUnit chronoUnit) {
  177. return Math.abs(start.until(end, chronoUnit));
  178. }
  179. /**
  180. * 获取本年第一天的日期字符串
  181. *
  182. * @return String 格式:yyyy-MM-dd 00:00:00
  183. */
  184. public static String getFirstDayOfYearStr() {
  185. return getFirstDayOfYearStr(LocalDateTime.now());
  186. }
  187. /**
  188. * 获取本年最后一天的日期字符串
  189. *
  190. * @return String 格式:yyyy-MM-dd 23:59:59
  191. */
  192. public static String getLastDayOfYearStr() {
  193. return getLastDayOfYearStr(LocalDateTime.now());
  194. }
  195. /**
  196. * 获取指定日期当年第一天的日期字符串
  197. *
  198. * @param localDateTime 指定日期时间
  199. * @return String 格式:yyyy-MM-dd 00:00:00
  200. */
  201. public static String getFirstDayOfYearStr(LocalDateTime localDateTime) {
  202. return getFirstDayOfYearStr(localDateTime, DATETIME_PATTERN);
  203. }
  204. /**
  205. * 获取指定日期当年最后一天的日期字符串
  206. *
  207. * @param localDateTime 指定日期时间
  208. * @return String 格式:yyyy-MM-dd 23:59:59
  209. */
  210. public static String getLastDayOfYearStr(LocalDateTime localDateTime) {
  211. return getLastDayOfYearStr(localDateTime, DATETIME_PATTERN);
  212. }
  213. /**
  214. * 获取指定日期当年第一天的日期字符串,带日期格式化参数
  215. *
  216. * @param localDateTime 指定日期时间
  217. * @param pattern 日期时间格式
  218. * @return String 格式:yyyy-MM-dd 00:00:00
  219. */
  220. public static String getFirstDayOfYearStr(LocalDateTime localDateTime, String pattern) {
  221. return format(localDateTime.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0), pattern);
  222. }
  223. /**
  224. * 获取指定日期当年最后一天的日期字符串,带日期格式化参数
  225. *
  226. * @param localDateTime 指定日期时间
  227. * @param pattern 日期时间格式
  228. * @return String 格式:yyyy-MM-dd 23:59:59
  229. */
  230. public static String getLastDayOfYearStr(LocalDateTime localDateTime, String pattern) {
  231. return format(localDateTime.with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59), pattern);
  232. }
  233. /**
  234. * 获取本月第一天的日期字符串
  235. *
  236. * @return String 格式:yyyy-MM-dd 00:00:00
  237. */
  238. public static String getFirstDayOfMonthStr() {
  239. return getFirstDayOfMonthStr(LocalDateTime.now());
  240. }
  241. /**
  242. * 获取本月最后一天的日期字符串
  243. *
  244. * @return String 格式:yyyy-MM-dd 23:59:59
  245. */
  246. public static String getLastDayOfMonthStr() {
  247. return getLastDayOfMonthStr(LocalDateTime.now());
  248. }
  249. /**
  250. * 获取指定日期当月第一天的日期字符串
  251. *
  252. * @param localDateTime 指定日期时间
  253. * @return String 格式:yyyy-MM-dd 23:59:59
  254. */
  255. public static String getFirstDayOfMonthStr(LocalDateTime localDateTime) {
  256. return getFirstDayOfMonthStr(localDateTime, DATETIME_PATTERN);
  257. }
  258. /**
  259. * 获取指定日期当月最后一天的日期字符串
  260. *
  261. * @param localDateTime 指定日期时间
  262. * @return String 格式:yyyy-MM-dd 23:59:59
  263. */
  264. public static String getLastDayOfMonthStr(LocalDateTime localDateTime) {
  265. return getLastDayOfMonthStr(localDateTime, DATETIME_PATTERN);
  266. }
  267. /**
  268. * 获取指定日期当月第一天的日期字符串,带日期格式化参数
  269. *
  270. * @param localDateTime 指定日期时间
  271. * @return String 格式:yyyy-MM-dd 00:00:00
  272. */
  273. public static String getFirstDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
  274. return format(localDateTime.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0), pattern);
  275. }
  276. /**
  277. * 获取指定日期当月最后一天的日期字符串,带日期格式化参数
  278. *
  279. * @param localDateTime 指定日期时间
  280. * @param pattern 日期时间格式
  281. * @return String 格式:yyyy-MM-dd 23:59:59
  282. */
  283. public static String getLastDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
  284. return format(localDateTime.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59), pattern);
  285. }
  286. /**
  287. * 获取本周第一天的日期字符串
  288. *
  289. * @return String 格式:yyyy-MM-dd 00:00:00
  290. */
  291. public static String getFirstDayOfWeekStr() {
  292. return getFirstDayOfWeekStr(LocalDateTime.now());
  293. }
  294. /**
  295. * 获取本周最后一天的日期字符串
  296. *
  297. * @return String 格式:yyyy-MM-dd 23:59:59
  298. */
  299. public static String getLastDayOfWeekStr() {
  300. return getLastDayOfWeekStr(LocalDateTime.now());
  301. }
  302. /**
  303. * 获取指定日期当周第一天的日期字符串,这里第一天为周一
  304. *
  305. * @param localDateTime 指定日期时间
  306. * @return String 格式:yyyy-MM-dd 00:00:00
  307. */
  308. public static String getFirstDayOfWeekStr(LocalDateTime localDateTime) {
  309. return getFirstDayOfWeekStr(localDateTime, DATETIME_PATTERN);
  310. }
  311. /**
  312. * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日
  313. *
  314. * @param localDateTime 指定日期时间
  315. * @return String 格式:yyyy-MM-dd 23:59:59
  316. */
  317. public static String getLastDayOfWeekStr(LocalDateTime localDateTime) {
  318. return getLastDayOfWeekStr(localDateTime, DATETIME_PATTERN);
  319. }
  320. /**
  321. * 获取指定日期当周第一天的日期字符串,这里第一天为周一,带日期格式化参数
  322. *
  323. * @param localDateTime 指定日期时间
  324. * @param pattern 日期时间格式
  325. * @return String 格式:yyyy-MM-dd 00:00:00
  326. */
  327. public static String getFirstDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
  328. return format(localDateTime.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0), pattern);
  329. }
  330. /**
  331. * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日,带日期格式化参数
  332. *
  333. * @param localDateTime 指定日期时间
  334. * @param pattern 日期时间格式
  335. * @return String 格式:yyyy-MM-dd 23:59:59
  336. */
  337. public static String getLastDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
  338. return format(localDateTime.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59), pattern);
  339. }
  340. /**
  341. * 获取今天开始时间的日期字符串
  342. *
  343. * @return String 格式:yyyy-MM-dd 00:00:00
  344. */
  345. public static String getStartTimeOfDayStr() {
  346. return getStartTimeOfDayStr(LocalDateTime.now());
  347. }
  348. /**
  349. * 获取今天结束时间的日期字符串
  350. *
  351. * @return String 格式:yyyy-MM-dd 23:59:59
  352. */
  353. public static String getEndTimeOfDayStr() {
  354. return getEndTimeOfDayStr(LocalDateTime.now());
  355. }
  356. /**
  357. * 获取指定日期开始时间的日期字符串
  358. *
  359. * @param localDateTime 指定日期时间
  360. * @return String 格式:yyyy-MM-dd 00:00:00
  361. */
  362. public static String getStartTimeOfDayStr(LocalDateTime localDateTime) {
  363. return getStartTimeOfDayStr(localDateTime, DATETIME_PATTERN);
  364. }
  365. /**
  366. * 获取指定日期结束时间的日期字符串
  367. *
  368. * @param localDateTime 指定日期时间
  369. * @return String 格式:yyyy-MM-dd 23:59:59
  370. */
  371. public static String getEndTimeOfDayStr(LocalDateTime localDateTime) {
  372. return getEndTimeOfDayStr(localDateTime, DATETIME_PATTERN);
  373. }
  374. /**
  375. * 获取指定日期开始时间的日期字符串,带日期格式化参数
  376. *
  377. * @param localDateTime 指定日期时间
  378. * @param pattern 日期时间格式
  379. * @return String 格式:yyyy-MM-dd HH:mm:ss
  380. */
  381. public static String getStartTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
  382. return format(localDateTime.withHour(0).withMinute(0).withSecond(0), pattern);
  383. }
  384. /**
  385. * 获取指定日期结束时间的日期字符串,带日期格式化参数
  386. *
  387. * @param localDateTime 指定日期时间
  388. * @param pattern 日期时间格式
  389. * @return String 格式:yyyy-MM-dd 23:59:59
  390. */
  391. public static String getEndTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
  392. return format(localDateTime.withHour(23).withMinute(59).withSecond(59), pattern);
  393. }
  394. /**
  395. * date1 是否大于 date2
  396. * @param date1 格式yyyy-MM-dd HH:mm:ss
  397. * @param date2 格式 yyyyMM 或 yyyy
  398. *
  399. * @author: lig
  400. * @date: 2023年09月06日 0006
  401. */
  402. public static boolean dateIsAfter(String date1,String date2) {
  403. if(StringUtils.isEmpty(date2)) return false;
  404. // String dateStr = "2018-06-20 00:00:00";
  405. // String dateStr2 = "201806";
  406. if(date2.length() < 5)date2 = date2 + "0101";
  407. if(date2.length() < 7)date2 = date2 +"01";
  408. LocalDate lRegisterDate = DateTimeUtil.parseLocalDate(date1, DateTimeUtil.DATE_PATTERN);
  409. LocalDate lVehicleYearDate = DateTimeUtil.parseLocalDate(date2, DateTimeUtil.UNSIGNED_DATE_PATTERN);
  410. // System.err.println("注册日期:"+lRegisterDate);
  411. // System.err.println("上市日期:"+lVehicleYearDate);
  412. return lVehicleYearDate.isBefore(lRegisterDate);
  413. }
  414. /**
  415. * 一天内 true 时间大于00:00:00 小于23:59:59
  416. * @param dateTime
  417. *
  418. * @author: lig
  419. * @date: 2023年09月11日 0011
  420. */
  421. public static boolean inOneDay(LocalDateTime dateTime){
  422. // LocalDateTime sDateTime = parseLocalDateTime(dateTime,DATETIME_PATTERN);
  423. LocalDateTime minTime = LocalDateTime.of(dateTime.toLocalDate(), LocalTime.MIN);
  424. LocalDateTime maxTime = LocalDateTime.of(dateTime.toLocalDate(), LocalTime.MAX);
  425. if(dateTime.isAfter(minTime) && dateTime.isBefore(maxTime)){
  426. // System.err.println("时间大于0点 小于23.59:"+sDateTime.isAfter(minTime));
  427. return true;
  428. }
  429. return false;
  430. }
  431. public static void main(String[] args) throws ParseException {
  432. List list = null;
  433. System.out.println(CollUtil.isEmpty(list));
  434. System.out.println("222:"+list.isEmpty());
  435. String dateStr = "2023-10-02 23:59:59";
  436. LocalDateTime sDateTime = parseLocalDateTime(dateStr,DATETIME_PATTERN);
  437. System.out.println("前一年:"+ DateTimeUtil.parseLocalDateToString(sDateTime.minusYears(1).toString(), DateTimeUtil.DATETIME_PATTERN));
  438. // LocalDateTime one = ;
  439. // String dateStr = "2018-06-20 23:59:59";
  440. //
  441. // LocalDateTime sDateTime = parseLocalDateTime(dateStr,DATETIME_PATTERN);
  442. //
  443. // LocalDateTime minTime = LocalDateTime.of(sDateTime.toLocalDate(), LocalTime.MIN);
  444. //
  445. // LocalDateTime maxTime = LocalDateTime.of(sDateTime.toLocalDate(), LocalTime.MAX);
  446. //
  447. // System.err.println("000:"+maxTime.toString());
  448. //
  449. // System.err.println("2222:"+sDateTime.isBefore(maxTime));
  450. //
  451. //
  452. // if(sDateTime.isAfter(minTime) && sDateTime.isBefore(maxTime)){
  453. // System.err.println("时间大于0点 小于23.59:"+sDateTime.isAfter(minTime));
  454. //
  455. // }
  456. // String dateStr2 = "201806";
  457. // if(dateStr2.length() < 7)dateStr2 = dateStr2 +"01";
  458. //// String aaa = DateTimeUtil.parseLocalDateToString(dateStr, DateTimeUtil.DATETIME_PATTERN);
  459. //// System.out.println("aaaa: " + aaa);
  460. //
  461. //
  462. // LocalDate lRegisterDate = DateTimeUtil.parseLocalDate(dateStr, DateTimeUtil.DATETIME_PATTERN);
  463. // LocalDate lVehicleYearDate = DateTimeUtil.parseLocalDate(dateStr2, DateTimeUtil.UNSIGNED_DATE_PATTERN);
  464. //
  465. // if(lVehicleYearDate.isAfter(lRegisterDate)){
  466. //
  467. // }
  468. //
  469. // System.err.println("注册日期:"+lRegisterDate);
  470. // System.err.println("上市日期:"+lVehicleYearDate);
  471. }
  472. }