1. import java.time.DayOfWeek;
    2. import java.time.LocalDate;
    3. import java.time.LocalDateTime;
    4. import java.time.Month;
    5. import java.time.temporal.*;
    6. /**
    7. * 日期类型 - 枚举类
    8. *
    9. * @author mingrn97 <br > mingrn97@gmail.com
    10. * @date 2021/01/31 15:43
    11. */
    12. public enum DateTimeType {
    13. /** 年份 */
    14. YEAR("Year", "年份", new Chrono() {
    15. @Override
    16. protected Chrono computeInterval() {
    17. return computeInterval(LocalDate.now());
    18. }
    19. @Override
    20. protected Chrono computeInterval(Temporal benchmark) {
    21. compute(benchmark, YEAR);
    22. return this;
    23. }
    24. }),
    25. /** 季度 */
    26. QUARTER("Quarter", "季度", new Chrono() {
    27. @Override
    28. protected Chrono computeInterval() {
    29. return computeInterval(LocalDate.now());
    30. }
    31. @Override
    32. protected Chrono computeInterval(Temporal benchmark) {
    33. compute(benchmark, QUARTER);
    34. return this;
    35. }
    36. }),
    37. /** 月份 */
    38. MONTH("Month", "月份", new Chrono() {
    39. @Override
    40. protected Chrono computeInterval() {
    41. return computeInterval(LocalDate.now());
    42. }
    43. @Override
    44. protected Chrono computeInterval(Temporal benchmark) {
    45. compute(benchmark, MONTH);
    46. return this;
    47. }
    48. }),
    49. /** 周 */
    50. WEEK("Week", "周", new Chrono() {
    51. @Override
    52. protected Chrono computeInterval() {
    53. return computeInterval(LocalDate.now());
    54. }
    55. @Override
    56. protected Chrono computeInterval(Temporal benchmark) {
    57. compute(benchmark, WEEK);
    58. return this;
    59. }
    60. }),
    61. /** 天 */
    62. DAY("Day", "天", new Chrono() {
    63. @Override
    64. protected Chrono computeInterval() {
    65. return computeInterval(LocalDateTime.now());
    66. }
    67. @Override
    68. protected Chrono computeInterval(Temporal benchmark) {
    69. compute(benchmark, DAY);
    70. return this;
    71. }
    72. }),
    73. ;
    74. private final String type;
    75. private final String phrase;
    76. private final Chrono chrono;
    77. DateTimeType(String type, String phrase, Chrono chrono) {
    78. this.type = type;
    79. this.phrase = phrase;
    80. this.chrono = chrono;
    81. }
    82. public String type() {
    83. return type;
    84. }
    85. public String phrase() {
    86. return phrase;
    87. }
    88. public Chrono chrono() {
    89. return chrono;
    90. }
    91. public static DateTimeType resolve(String type) {
    92. for (DateTimeType dateTimeType : values()) {
    93. if (dateTimeType.type.equalsIgnoreCase(type)) {
    94. return dateTimeType;
    95. }
    96. }
    97. return null;
    98. }
    99. public static String value(String type) {
    100. DateTimeType dateTimeType = resolve(type);
    101. if (dateTimeType == null) {
    102. throw new IllegalArgumentException("No matching constant for [" + type + "]");
    103. }
    104. return dateTimeType.phrase;
    105. }
    106. public abstract static class Chrono {
    107. /** 上周期开始与结束时间 */
    108. private String lastIntervalStart;
    109. private String lastIntervalEnd;
    110. /** 本周期开始与结束时间 */
    111. private String intervalStart;
    112. private String intervalEnd;
    113. public String lastIntervalStart() {
    114. return lastIntervalStart;
    115. }
    116. public String lastIntervalEnd() {
    117. return lastIntervalEnd;
    118. }
    119. public String intervalStart() {
    120. return intervalStart;
    121. }
    122. public String intervalEnd() {
    123. return intervalEnd;
    124. }
    125. /**
    126. * 周期计算
    127. *
    128. * @return this
    129. */
    130. protected abstract Chrono computeInterval();
    131. /**
    132. * 周期计算
    133. *
    134. * @param benchmark 指定基准时间
    135. * @return this
    136. */
    137. protected abstract Chrono computeInterval(Temporal benchmark);
    138. /**
    139. * 计算
    140. *
    141. * @param benchmark 指定基准时间
    142. * @param dateTimeType 计算日期类型
    143. */
    144. protected void compute(Temporal benchmark, DateTimeType dateTimeType) {
    145. LocalDate date;
    146. LocalDate last;
    147. switch (dateTimeType) {
    148. case YEAR:
    149. date = convert2LocalDate(benchmark);
    150. this.intervalStart = date.with(TemporalAdjusters.firstDayOfYear()).toString();
    151. this.intervalEnd = date.with(TemporalAdjusters.firstDayOfNextYear()).toString();
    152. last = date.minus(1, ChronoUnit.YEARS);
    153. this.lastIntervalStart = last.with(TemporalAdjusters.firstDayOfYear()).toString();
    154. this.lastIntervalEnd = this.intervalStart;
    155. break;
    156. case QUARTER:
    157. date = convert2LocalDate(benchmark);
    158. // 当前季度第一个月第一天
    159. Month qMonth = date.getMonth().firstMonthOfQuarter();
    160. date = LocalDate.of(date.getYear(), qMonth, 1);
    161. // 下季度第一天
    162. LocalDate nextQ = date.plusMonths(3L);
    163. // 上季度第一天
    164. LocalDate lastQ = date.minusMonths(3L);
    165. this.intervalStart = date.toString();
    166. this.intervalEnd = nextQ.toString();
    167. this.lastIntervalStart = lastQ.toString();
    168. this.lastIntervalEnd = this.intervalStart;
    169. break;
    170. case MONTH:
    171. date = convert2LocalDate(benchmark);
    172. // 本周期
    173. this.intervalStart = date.with(TemporalAdjusters.firstDayOfMonth()).toString();
    174. this.intervalEnd = date.with(TemporalAdjusters.firstDayOfNextMonth()).toString();
    175. // 上周期
    176. last = date.minusMonths(1L);
    177. this.lastIntervalStart = last.with(TemporalAdjusters.firstDayOfMonth()).toString();
    178. this.lastIntervalEnd = this.intervalStart;
    179. break;
    180. case WEEK:
    181. date = convert2LocalDate(benchmark);
    182. TemporalField dayOfWeekField = WeekFields.of(DayOfWeek.MONDAY, 1).dayOfWeek();
    183. // 本周
    184. this.intervalStart = date.with(dayOfWeekField, 1).toString();
    185. this.intervalEnd = date.plusWeeks(1L).with(dayOfWeekField, 1).toString();
    186. // 上周
    187. this.lastIntervalStart = date.minusWeeks(1L).with(dayOfWeekField, 1).toString();
    188. this.lastIntervalEnd = this.intervalStart;
    189. break;
    190. case DAY:
    191. date = convert2LocalDate(benchmark);
    192. // 当前天
    193. this.intervalStart = date.toString();
    194. this.intervalEnd = date.plusDays(1L).toString();
    195. // 上一天
    196. this.lastIntervalStart = date.minusDays(1L).toString();
    197. this.lastIntervalEnd = this.intervalStart;
    198. break;
    199. default:
    200. throw new UnsupportedOperationException("日期类型错误");
    201. }
    202. }
    203. private static LocalDate convert2LocalDate(Temporal benchmark) {
    204. if (benchmark instanceof LocalDate) {
    205. return (LocalDate) benchmark;
    206. } else if (benchmark instanceof LocalDateTime) {
    207. LocalDateTime dateTime = (LocalDateTime) benchmark;
    208. return LocalDate.of(dateTime.getYear(), dateTime.getMonth(), dateTime.getDayOfMonth());
    209. } else {
    210. throw new UnsupportedOperationException("参数 java.time.temporal.Temporal " +
    211. "只支持 java.time.LocalDate 以及 java.time.LocalDateTime");
    212. }
    213. }
    214. }
    215. }
    1. public static Map<String, Object> calculateTimePeriod(String format, String begTime, String endTime) {
    2. Map<String, Object> map = new HashMap<>();
    3. try {
    4. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
    5. LocalDate begDate = LocalDate.parse(begTime, formatter);
    6. LocalDate endDate = LocalDate.parse(endTime, formatter);
    7. int begDay = begDate.getDayOfMonth();
    8. int endYear = endDate.getYear();
    9. int endMonth = endDate.getMonthValue();
    10. int endDay = endDate.getDayOfMonth();
    11. LocalDate compareDate = LocalDate.of(endYear, endDay < begDay ? endMonth - 1 : endMonth, begDay);
    12. long y = ChronoUnit.YEARS.between(begDate, compareDate);
    13. long m = ChronoUnit.MONTHS.between(begDate, compareDate) % 12;
    14. long d = ChronoUnit.DAYS.between(compareDate, endDate);
    15. map.put("y", y);
    16. map.put("m", m);
    17. map.put("d", d);
    18. map.put("desc", y + "年" + m + "月" + d + "日");
    19. } catch (Exception e) {
    20. e.printStackTrace();
    21. }
    22. return map;
    23. }