DateUtils.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. package com.zhongshu.card.client.utils;
  2. import lombok.SneakyThrows;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.commons.lang3.StringUtils;
  5. import java.sql.Timestamp;
  6. import java.text.ParseException;
  7. import java.text.SimpleDateFormat;
  8. import java.time.*;
  9. import java.time.temporal.IsoFields;
  10. import java.time.temporal.WeekFields;
  11. import java.util.*;
  12. @Slf4j
  13. public class DateUtils {
  14. public final static String FORMAT_LONG = "yyyy-MM-dd HH:mm:ss";
  15. public final static String pattern = "yyyy-MM-dd";
  16. /**
  17. * yyyyMMdd
  18. */
  19. public final static String pattern1 = "yyyyMMdd";
  20. public final static String patternStr = "yyyy年MM月dd日";
  21. public final static String patternyyyyMM = "yyyy-MM";
  22. public final static String patternyyyyM = "yyyy-M";
  23. public final static String patternHHmm = "HH:mm";
  24. public final static String patternyyyyMis = "yyyy-MM-dd HH:mm";
  25. public final static String patternyyyySSS = "yyyy-MM-dd HH:mm:ss SSS";
  26. public final static String patternyyyy = "yyyy";
  27. public final static String patternMM = "MM";
  28. public final static String patternWx = "yyyy-MM-dd'T'HH:mm:ssXXX";
  29. public final static String unionAuth = "yyyyMMddHHmmss";
  30. public static Long timeToLong(String time) {
  31. return timeToLong(time, FORMAT_LONG);
  32. }
  33. public static Long timeToLong(String time, String format) {
  34. if (!org.springframework.util.StringUtils.hasText(time)) {
  35. return null;
  36. }
  37. try {
  38. return new SimpleDateFormat(format).parse(time).getTime();
  39. } catch (ParseException e) {
  40. e.printStackTrace();
  41. }
  42. return null;
  43. }
  44. @SneakyThrows
  45. public static Double timeToDouble(String time, String format) {
  46. assert format != null;
  47. Long timestamp = null;
  48. if (StringUtils.isNotBlank(time)) {
  49. timestamp = new SimpleDateFormat(format).parse(time).getTime();
  50. }
  51. if (timestamp != null) {
  52. return timestamp.doubleValue();
  53. }
  54. return null;
  55. }
  56. public static String paresTime(Long time, String pattern) {
  57. if (time == null || time <= 0) {
  58. return "";
  59. }
  60. Date date = new Date(time);
  61. SimpleDateFormat formatter = new SimpleDateFormat(pattern);
  62. return formatter.format(date);
  63. }
  64. /**
  65. * 获得本周的第一天,周一
  66. *
  67. * @return
  68. */
  69. public static Long getCurrentWeekDayStartTime() {
  70. Calendar c = Calendar.getInstance();
  71. int weekday = c.get(Calendar.DAY_OF_WEEK) - 2;
  72. c.add(Calendar.DATE, -weekday);
  73. c.set(Calendar.HOUR_OF_DAY, 0);
  74. c.set(Calendar.MINUTE, 0);
  75. c.set(Calendar.SECOND, 0);
  76. return c.getTimeInMillis();
  77. }
  78. /**
  79. * 获得上周的第一天,周一
  80. *
  81. * @return
  82. */
  83. public static Long getBeforeWeekDayStartTime() {
  84. Calendar c = Calendar.getInstance();
  85. int weekday = c.get(Calendar.DAY_OF_WEEK) - 2 + 7;
  86. c.add(Calendar.DATE, -weekday);
  87. c.set(Calendar.HOUR_OF_DAY, 0);
  88. c.set(Calendar.MINUTE, 0);
  89. c.set(Calendar.SECOND, 0);
  90. return c.getTimeInMillis();
  91. }
  92. /**
  93. * 获得上周的最后一天,周日
  94. *
  95. * @return
  96. */
  97. public static Long getBeforeWeekDayEndTime() {
  98. Calendar c = Calendar.getInstance();
  99. int weekday = c.get(Calendar.DAY_OF_WEEK);
  100. c.add(Calendar.DATE, 8 - weekday - 7);
  101. c.set(Calendar.HOUR_OF_DAY, 23);
  102. c.set(Calendar.MINUTE, 59);
  103. c.set(Calendar.SECOND, 59);
  104. return c.getTimeInMillis();
  105. }
  106. /**
  107. * 获得本周的最后一天,周日
  108. *
  109. * @return
  110. */
  111. public static Long getCurrentWeekDayEndTime() {
  112. Calendar c = Calendar.getInstance();
  113. int weekday = c.get(Calendar.DAY_OF_WEEK);
  114. c.add(Calendar.DATE, 8 - weekday);
  115. c.set(Calendar.HOUR_OF_DAY, 23);
  116. c.set(Calendar.MINUTE, 59);
  117. c.set(Calendar.SECOND, 59);
  118. return c.getTimeInMillis();
  119. }
  120. /**
  121. * 获得本天的开始时间
  122. *
  123. * @return
  124. */
  125. public static Date getCurrentDayStartTime() {
  126. ZoneId zoneId = ZoneId.systemDefault();
  127. LocalDateTime date = LocalDateTime.now();
  128. LocalDateTime startOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MIN);
  129. Date beginTime = Date.from(startOfTheDay.atZone(zoneId).toInstant());
  130. return beginTime;
  131. }
  132. /**
  133. * 获得本天的结束时间
  134. *
  135. * @return
  136. */
  137. public static Date getCurrentDayEndTime() {
  138. ZoneId zoneId = ZoneId.systemDefault();
  139. LocalDateTime date = LocalDateTime.now();
  140. LocalDateTime startOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MAX);
  141. Date beginTime = Date.from(startOfTheDay.atZone(zoneId).toInstant());
  142. return beginTime;
  143. }
  144. /**
  145. * 得到当前是本周第几天
  146. *
  147. * @return
  148. */
  149. public static int getCurrentWeekDay() {
  150. Calendar c = Calendar.getInstance();
  151. int weekday = c.get(Calendar.DAY_OF_WEEK);
  152. return weekday - 1;
  153. }
  154. /**
  155. * 当前是今年第几周
  156. *
  157. * @return
  158. */
  159. public static int getCurrentWeekInYear() {
  160. LocalDate date = LocalDate.now(); // 获取当前日期
  161. int weekOfYear = date.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
  162. return weekOfYear;
  163. }
  164. /**
  165. * 得到当前是第几月份,如:8
  166. *
  167. * @return
  168. */
  169. public static int getCurrentMonthInYear() {
  170. LocalDate date = LocalDate.now(); // 获取当前日期
  171. return date.getMonthValue();
  172. }
  173. /**
  174. * 得到当前年份,如:2024
  175. *
  176. * @return
  177. */
  178. public static int getCurrentYear() {
  179. LocalDate date = LocalDate.now(); // 获取当前日期
  180. return date.getYear();
  181. }
  182. /**
  183. * 在月份的第几天
  184. *
  185. * @return
  186. */
  187. public static int getCurrentDayInMonth() {
  188. LocalDate date = LocalDate.now();
  189. return date.getDayOfMonth();
  190. }
  191. /**
  192. * 在年的第几天
  193. *
  194. * @return
  195. */
  196. public static int getCurrentDayInYear() {
  197. LocalDate date = LocalDate.now();
  198. return date.getDayOfYear();
  199. }
  200. /**
  201. * 当前的第几小时
  202. *
  203. * @return
  204. */
  205. public static int getCurrentHourOfDay() {
  206. Calendar calendar = Calendar.getInstance();
  207. return calendar.get(Calendar.HOUR_OF_DAY);
  208. }
  209. /**
  210. * 获得本小时的开始时间
  211. *
  212. * @return
  213. */
  214. public static Long getCurrentHourStartTime() {
  215. Calendar calendar = Calendar.getInstance();
  216. calendar.set(Calendar.MINUTE, 0);
  217. calendar.set(Calendar.SECOND, 0);
  218. return calendar.getTimeInMillis();
  219. }
  220. /**
  221. * 获得本小时的结束时间
  222. *
  223. * @return
  224. */
  225. public static Long getCurrentHourEndTime() {
  226. Calendar calendar = Calendar.getInstance();
  227. calendar.set(Calendar.MINUTE, 59);
  228. calendar.set(Calendar.SECOND, 59);
  229. return calendar.getTimeInMillis();
  230. }
  231. /**
  232. * 获得本月的开始时间
  233. *
  234. * @return
  235. */
  236. public static Long getCurrentMonthStartTime() {
  237. Calendar c = Calendar.getInstance();
  238. c.set(Calendar.DATE, 1);
  239. c.set(Calendar.HOUR_OF_DAY, 0);
  240. c.set(Calendar.MINUTE, 0);
  241. c.set(Calendar.SECOND, 0);
  242. return c.getTimeInMillis();
  243. }
  244. /**
  245. * 获得上个月的开始时间
  246. *
  247. * @return
  248. */
  249. public static Long getBeforeMonthStartTime() {
  250. Calendar c = Calendar.getInstance();
  251. c.add(Calendar.MONTH, -1);
  252. c.set(Calendar.DATE, 1);
  253. c.set(Calendar.HOUR_OF_DAY, 0);
  254. c.set(Calendar.MINUTE, 0);
  255. c.set(Calendar.SECOND, 0);
  256. return c.getTimeInMillis();
  257. }
  258. /**
  259. * 本月的结束时间
  260. *
  261. * @return
  262. */
  263. public static Long getCurrentMonthEndTime() {
  264. Calendar c = Calendar.getInstance();
  265. c.set(Calendar.DATE, 1);
  266. c.add(Calendar.MONTH, 1);
  267. c.add(Calendar.DATE, -1);
  268. c.set(Calendar.HOUR_OF_DAY, 23);
  269. c.set(Calendar.MINUTE, 59);
  270. c.set(Calendar.SECOND, 59);
  271. return c.getTimeInMillis();
  272. }
  273. public static Long getBeforeMonthEndTime() {
  274. Calendar c = Calendar.getInstance();
  275. c.set(Calendar.DATE, 1);
  276. c.add(Calendar.DATE, -1);
  277. c.set(Calendar.HOUR_OF_DAY, 23);
  278. c.set(Calendar.MINUTE, 59);
  279. c.set(Calendar.SECOND, 59);
  280. return c.getTimeInMillis();
  281. }
  282. /**
  283. * 当前年的开始时间
  284. *
  285. * @return
  286. */
  287. public static Long getCurrentYearStartTime() {
  288. Calendar c = Calendar.getInstance();
  289. c.set(Calendar.MONTH, 0);
  290. c.set(Calendar.DATE, 1);
  291. c.set(Calendar.HOUR_OF_DAY, 0);
  292. c.set(Calendar.MINUTE, 0);
  293. c.set(Calendar.SECOND, 0);
  294. return c.getTimeInMillis();
  295. }
  296. /**
  297. * 当前年的结束时间
  298. *
  299. * @return
  300. */
  301. public static Long getCurrentYearEndTime() {
  302. Calendar c = Calendar.getInstance();
  303. Date now = null;
  304. c.set(Calendar.MONTH, 11);
  305. c.set(Calendar.DATE, 31);
  306. c.set(Calendar.HOUR_OF_DAY, 23);
  307. c.set(Calendar.MINUTE, 59);
  308. c.set(Calendar.SECOND, 59);
  309. return c.getTimeInMillis();
  310. }
  311. /**
  312. * 当前季度的开始时间
  313. *
  314. * @return
  315. */
  316. public static Long getCurrentQuarterStartTime() {
  317. Calendar c = Calendar.getInstance();
  318. int currentMonth = c.get(Calendar.MONTH) + 1;
  319. if (currentMonth >= 1 && currentMonth <= 3)
  320. c.set(Calendar.MONTH, 0);
  321. else if (currentMonth >= 4 && currentMonth <= 6)
  322. c.set(Calendar.MONTH, 3);
  323. else if (currentMonth >= 7 && currentMonth <= 9)
  324. c.set(Calendar.MONTH, 4);
  325. else if (currentMonth >= 10 && currentMonth <= 12)
  326. c.set(Calendar.MONTH, 9);
  327. c.set(Calendar.DATE, 1);
  328. c.set(Calendar.HOUR_OF_DAY, 0);
  329. c.set(Calendar.MINUTE, 0);
  330. c.set(Calendar.SECOND, 0);
  331. return c.getTimeInMillis();
  332. }
  333. /**
  334. * 当前季度的结束时间
  335. *
  336. * @return
  337. */
  338. public static Long getCurrentQuarterEndTime() {
  339. Calendar c = Calendar.getInstance();
  340. int currentMonth = c.get(Calendar.MONTH) + 1;
  341. Date now = null;
  342. try {
  343. if (currentMonth >= 1 && currentMonth <= 3) {
  344. c.set(Calendar.MONTH, 2);
  345. c.set(Calendar.DATE, 31);
  346. } else if (currentMonth >= 4 && currentMonth <= 6) {
  347. c.set(Calendar.MONTH, 5);
  348. c.set(Calendar.DATE, 30);
  349. } else if (currentMonth >= 7 && currentMonth <= 9) {
  350. c.set(Calendar.MONTH, 8);
  351. c.set(Calendar.DATE, 30);
  352. } else if (currentMonth >= 10 && currentMonth <= 12) {
  353. c.set(Calendar.MONTH, 11);
  354. c.set(Calendar.DATE, 31);
  355. }
  356. c.set(Calendar.HOUR_OF_DAY, 23);
  357. c.set(Calendar.MINUTE, 59);
  358. c.set(Calendar.SECOND, 59);
  359. } catch (Exception e) {
  360. e.printStackTrace();
  361. }
  362. return now.getTime();
  363. }
  364. /**
  365. * 获取前/后半年的开始时间
  366. *
  367. * @return
  368. */
  369. public static Long getHalfYearStartTime() {
  370. Calendar c = Calendar.getInstance();
  371. int currentMonth = c.get(Calendar.MONTH) + 1;
  372. if (currentMonth >= 1 && currentMonth <= 6) {
  373. c.set(Calendar.MONTH, 0);
  374. } else if (currentMonth >= 7 && currentMonth <= 12) {
  375. c.set(Calendar.MONTH, 6);
  376. }
  377. c.set(Calendar.DATE, 1);
  378. c.set(Calendar.HOUR_OF_DAY, 0);
  379. c.set(Calendar.MINUTE, 0);
  380. c.set(Calendar.SECOND, 0);
  381. return c.getTimeInMillis();
  382. }
  383. /**
  384. * 获取前/后半年的结束时间
  385. *
  386. * @return
  387. */
  388. public static Long getHalfYearEndTime() {
  389. Calendar c = Calendar.getInstance();
  390. int currentMonth = c.get(Calendar.MONTH) + 1;
  391. if (currentMonth >= 1 && currentMonth <= 6) {
  392. c.set(Calendar.MONTH, 5);
  393. c.set(Calendar.DATE, 30);
  394. } else if (currentMonth >= 7 && currentMonth <= 12) {
  395. c.set(Calendar.MONTH, 11);
  396. c.set(Calendar.DATE, 31);
  397. }
  398. c.set(Calendar.HOUR_OF_DAY, 23);
  399. c.set(Calendar.MINUTE, 59);
  400. c.set(Calendar.SECOND, 59);
  401. return c.getTimeInMillis();
  402. }
  403. public static Date parseStr2Date(String dateStr) {
  404. SimpleDateFormat longSdf = new SimpleDateFormat(FORMAT_LONG);
  405. try {
  406. return longSdf.parse(dateStr);
  407. } catch (Exception e) {
  408. e.printStackTrace();
  409. }
  410. return null;
  411. }
  412. public static Date parseStr2Date(String dateStr, String format) {
  413. SimpleDateFormat longSdf = new SimpleDateFormat(format);
  414. try {
  415. if(StringUtils.isNotEmpty(dateStr)) {
  416. return longSdf.parse(dateStr);
  417. }
  418. } catch (Exception e) {
  419. e.printStackTrace();
  420. }
  421. return null;
  422. }
  423. public static String getShort2Str(Date date) {
  424. if (date == null) {
  425. return null;
  426. }
  427. SimpleDateFormat shortSdf = new SimpleDateFormat(pattern);
  428. return shortSdf.format(date);
  429. }
  430. /**
  431. * 毫秒数转时间
  432. *
  433. * @return
  434. */
  435. public static String millsToDuration(long mills) {
  436. long dayBal = mills % (86400000);
  437. int days = Long.valueOf(mills / 86400000).intValue();
  438. long hourBal = dayBal % (3600000);
  439. int hours = Long.valueOf(dayBal / (3600000)).intValue();
  440. long minuteBal = hourBal % (60000);
  441. int minutes = Long.valueOf(hourBal / (60000)).intValue();
  442. int seconds = Long.valueOf(Long.valueOf(minuteBal / 1000).intValue()).intValue();
  443. String str = "";
  444. if (days > 0) {
  445. str += days + "天";
  446. }
  447. if (hours > 0) {
  448. str += hours + "小时";
  449. }
  450. if (minutes > 0) {
  451. str += minutes + "分钟";
  452. }
  453. if (seconds > 0) {
  454. str += seconds + "秒";
  455. }
  456. return str;
  457. }
  458. public static Long getDayStartTime(Long timestamp) {
  459. ZoneId zoneId = ZoneId.systemDefault();
  460. LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zoneId);
  461. LocalDateTime startOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MIN);
  462. return Timestamp.valueOf(startOfTheDay).getTime();
  463. }
  464. /**
  465. * 获得本天的结束时间
  466. *
  467. * @return
  468. */
  469. public static Long getDayEndTime(Long timestamp) {
  470. ZoneId zoneId = ZoneId.systemDefault();
  471. LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zoneId);
  472. LocalDateTime endOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MAX);
  473. return Timestamp.valueOf(endOfTheDay).getTime();
  474. }
  475. /**
  476. * 获得时间在当年的周数
  477. *
  478. * @return
  479. */
  480. public static Integer getWeekOfYear(Long timestamp) {
  481. ZoneId zoneId = ZoneId.systemDefault();
  482. LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zoneId);
  483. // WeekFields.ISO = 一星期从周一开始算, 其它的请自己摸索.
  484. WeekFields weekFields = WeekFields.ISO;
  485. int weekNumber = date.get(weekFields.weekOfWeekBasedYear());
  486. return weekNumber;
  487. }
  488. public static Integer getYearWeekCount(Integer year) {
  489. Calendar c = Calendar.getInstance();
  490. c.set(Calendar.YEAR, year);
  491. c.set(Calendar.MONTH, Calendar.DECEMBER);
  492. c.set(Calendar.DATE, 31);
  493. Integer weekCount = getWeekOfYear(c.getTimeInMillis());
  494. //log.info("多少周:{}",weekCount);
  495. return weekCount;
  496. }
  497. public static Long getWeekStartTime(Integer year, Integer week) {
  498. Calendar c = new GregorianCalendar();
  499. //获得指定年的第几周的开始日期(dayOfWeek是从周日开始排序的)
  500. c.setWeekDate(year, week, 2);
  501. c.set(Calendar.HOUR_OF_DAY, 0);
  502. c.set(Calendar.MINUTE, 0);
  503. c.set(Calendar.SECOND, 0);
  504. //获得Calendar的时间
  505. Date starttime = c.getTime();
  506. //log.info("{}年第{}周的开始日期为{}" ,year,week,paresTime(starttime.getTime(),FORMAT_LONG));
  507. return starttime.getTime();
  508. }
  509. public static Long getWeekEndTime(Integer year, Integer week) {
  510. Calendar c = new GregorianCalendar();
  511. //获得指定年的第几周的结束日期
  512. c.setWeekDate(year, week + 1, 1);
  513. c.set(Calendar.HOUR_OF_DAY, 23);
  514. c.set(Calendar.MINUTE, 59);
  515. c.set(Calendar.SECOND, 59);
  516. Date endtime = c.getTime();
  517. //将时间戳格式化为指定格式
  518. //log.info("{}年第{}周的结束日期为{}" ,year,week,paresTime(endtime.getTime(),FORMAT_LONG));
  519. return endtime.getTime();
  520. }
  521. /**
  522. * 本月的结束时间
  523. *
  524. * @return
  525. */
  526. public static Long getMonthStartTime(Integer year, Integer month) {
  527. Calendar c = Calendar.getInstance();
  528. c.set(Calendar.YEAR, year);
  529. c.set(Calendar.MONTH, month - 1);
  530. c.set(Calendar.DATE, 1);
  531. c.set(Calendar.HOUR_OF_DAY, 0);
  532. c.set(Calendar.MINUTE, 0);
  533. c.set(Calendar.SECOND, 0);
  534. return c.getTimeInMillis();
  535. }
  536. /**
  537. * 本月的结束时间
  538. *
  539. * @return
  540. */
  541. public static Long getMonthEndTime(Integer year, Integer month) {
  542. Calendar c = Calendar.getInstance();
  543. c.set(Calendar.YEAR, year);
  544. c.set(Calendar.MONTH, month - 1);
  545. c.add(Calendar.MONTH, 1);
  546. c.set(Calendar.DAY_OF_MONTH, 0);
  547. c.set(Calendar.HOUR_OF_DAY, 23);
  548. c.set(Calendar.MINUTE, 59);
  549. c.set(Calendar.SECOND, 59);
  550. return c.getTimeInMillis();
  551. }
  552. /**
  553. * 本年的开始时间
  554. *
  555. * @return
  556. */
  557. public static Long getYearStartTime(Integer year) {
  558. Calendar c = Calendar.getInstance();
  559. c.set(Calendar.YEAR, year);
  560. c.set(Calendar.MONTH, Calendar.JANUARY);
  561. c.set(Calendar.DATE, 1);
  562. c.set(Calendar.HOUR_OF_DAY, 0);
  563. c.set(Calendar.MINUTE, 0);
  564. c.set(Calendar.SECOND, 0);
  565. return c.getTimeInMillis();
  566. }
  567. /**
  568. * 本年的开始时间
  569. *
  570. * @return
  571. */
  572. public static Long getYearEndTime(Integer year) {
  573. Calendar c = Calendar.getInstance();
  574. c.set(Calendar.YEAR, year);
  575. c.set(Calendar.MONTH, Calendar.DECEMBER);
  576. c.set(Calendar.DATE, 31);
  577. c.set(Calendar.HOUR_OF_DAY, 23);
  578. c.set(Calendar.MINUTE, 59);
  579. c.set(Calendar.SECOND, 59);
  580. return c.getTimeInMillis();
  581. }
  582. /**
  583. * 得到给定时间的 当天开始时间
  584. *
  585. * @param time
  586. * @return
  587. */
  588. public static Long getDayStart(Long time) {
  589. Calendar calendar = Calendar.getInstance();
  590. calendar.setTimeInMillis(time);
  591. calendar.set(Calendar.HOUR_OF_DAY, 0);
  592. calendar.set(Calendar.MINUTE, 0);
  593. calendar.set(Calendar.SECOND, 0);
  594. calendar.set(Calendar.MILLISECOND, 0);
  595. return calendar.getTimeInMillis();
  596. }
  597. /**
  598. * 得到给定时间的 当天最大时间
  599. *
  600. * @param time
  601. * @return
  602. */
  603. public static Long getDayEnd(Long time) {
  604. Calendar calendar = Calendar.getInstance();
  605. calendar.setTimeInMillis(time);
  606. calendar.set(Calendar.HOUR_OF_DAY, 23);
  607. calendar.set(Calendar.MINUTE, 59);
  608. calendar.set(Calendar.SECOND, 59);
  609. return calendar.getTimeInMillis();
  610. }
  611. /**
  612. * 转换日期为:2023-10-10 00:00:00 再加上天数
  613. *
  614. * @param time
  615. * @param days
  616. * @return
  617. */
  618. public static Calendar getCalendarDayAndDays(Long time, int days) {
  619. Calendar calendar = Calendar.getInstance();
  620. Date endDate = new Date(time);
  621. calendar.setTime(endDate);
  622. calendar.set(Calendar.HOUR_OF_DAY, 0);
  623. calendar.set(Calendar.MINUTE, 0);
  624. calendar.set(Calendar.SECOND, 0);
  625. calendar.set(Calendar.MILLISECOND, 0);
  626. calendar.add(Calendar.DATE, days);
  627. return calendar;
  628. }
  629. /**
  630. * 日期加减天数,,中间跳过节假日 (不包括自己)
  631. *
  632. * @param time
  633. * @param days
  634. * @param holiday
  635. * @return
  636. */
  637. public static Calendar getCalendarDayAndDays(Long time, int days, List<String> holiday) {
  638. if (holiday == null) {
  639. holiday = new ArrayList<>();
  640. }
  641. Calendar calendar = Calendar.getInstance();
  642. Date endDate = new Date(time);
  643. calendar.setTime(endDate);
  644. calendar.set(Calendar.HOUR_OF_DAY, 0);
  645. calendar.set(Calendar.MINUTE, 0);
  646. calendar.set(Calendar.SECOND, 0);
  647. calendar.set(Calendar.MILLISECOND, 0);
  648. if (days != 0) {
  649. boolean isAdd = true;
  650. if (days < 0) {
  651. isAdd = false;
  652. }
  653. int count = Math.abs(days);
  654. int sumCount = 0;
  655. while (true) {
  656. if (isAdd) {
  657. calendar.add(Calendar.DATE, 1);
  658. } else {
  659. calendar.add(Calendar.DATE, -1);
  660. }
  661. String str = DateUtils.paresTime(calendar.getTimeInMillis(), DateUtils.pattern);
  662. if (!holiday.contains(str)) {
  663. sumCount++;
  664. } else {
  665. log.info("休息日:{}", str);
  666. }
  667. if (count == sumCount) {
  668. break;
  669. }
  670. }
  671. }
  672. return calendar;
  673. }
  674. public static void main(String[] args) {
  675. log.info("本年开始时间:{},结束时间:{}", paresTime(getYearStartTime(2023), FORMAT_LONG), paresTime(getYearEndTime(2023), FORMAT_LONG));
  676. log.info("本月开始时间:{},结束时间:{}", paresTime(getMonthStartTime(2023, 9), FORMAT_LONG), paresTime(getMonthEndTime(2023, 9), FORMAT_LONG));
  677. Integer weekNumber = getWeekOfYear(System.currentTimeMillis());
  678. log.info("本年一共{}周,本周是第{}周,本周时间区间:{}-{}", getYearWeekCount(2023), weekNumber, paresTime(getWeekStartTime(2023, weekNumber), FORMAT_LONG), paresTime(getWeekEndTime(2023, weekNumber), FORMAT_LONG));
  679. }
  680. }