public class DateUtils {
/**
1. 显示年月日时分秒,例如 2015-08-11 09:51:53.
*/
public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
2. 仅显示年月日,例如 2015-08-11.
*/
public static final String DATE_PATTERN = "yyyy-MM-dd";
/**
3. 仅显示时分秒,例如 09:51:53.
*/
public static final String TIME_PATTERN = "HH:mm:ss";
/**
4. 仅显示时分(无符号),例如0951
*/
public static final String UNSIGNED_TIME_PATTERN = "HHmm";
/**
5. 仅显示时分,例如:09:51
*/
public static final String TIME_MINUTE_PATTERN = "HH:mm";
/**
6. 显示年月日时分秒(无符号),例如 20150811095153.
*/
public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss";
public static final String UNSIGNED_DATEHOUR_PATTERN = "yyyyMMddHH";
/**
7. 仅显示年月日(无符号),例如 20150811.
*/
public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";
/**
8. 春天;
*/
public static final Integer SPRING = 1;
/**
9. 夏天;
*/
public static final Integer SUMMER = 2;
/**
10. 秋天;
*/
public static final Integer AUTUMN = 3;
/**
11. 冬天;
*/
public static final Integer WINTER = 4;
/**
12. 星期日;
*/
public static final String SUNDAY = "星期日";
/**
13. 星期一;
*/
public static final String MONDAY = "星期一";
/**
14. 星期二;
*/
public static final String TUESDAY = "星期二";
/**
15. 星期三;
*/
public static final String WEDNESDAY = "星期三";
/**
16. 星期四;
*/
public static final String THURSDAY = "星期四";
/**
17. 星期五;
*/
public static final String FRIDAY = "星期五";
/**
18. 星期六;
*/
public static final String SATURDAY = "星期六";
/**
19. 年
*/
private static final String YEAR = "year";
/**
20. 月
*/
private static final String MONTH = "month";
/**
21. 周
*/
private static final String WEEK = "week";
/**
22. 日
*/
private static final String DAY = "day";
/**
23. 时
*/
private static final String HOUR = "hour";
/**
24. 分
*/
private static final String MINUTE = "minute";
/**
25. 秒
*/
private static final String SECOND = "second";
public static String getLocalTimeStr(String time, String pattern) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
LocalTime localTime = LocalTime.parse(time, dateTimeFormatter);
return format(localTime, UNSIGNED_TIME_PATTERN);
}
/**
26. 获取当前日期和时间字符串.
27. 28. @return String 日期时间字符串,例如 2015-08-11 09:51:53
*/
public static String getLocalDateTimeStr() {
return format(LocalDateTime.now(), DATETIME_PATTERN);
}
/**
29. 获取当前日期字符串.
30. 31. @return String 日期字符串,例如2015-08-11
*/
public static String getLocalDateStr() {
return format(LocalDate.now(), DATE_PATTERN);
}
/**
32. 获取当前时间字符串.
33. 34. @return String 时间字符串,例如 09:51:53
*/
public static String getLocalTimeStr() {
return format(LocalTime.now(), TIME_PATTERN);
}
/**
35. 获取当前星期字符串.
36. 37. @return String 当前星期字符串,例如 星期二
*/
public static String getDayOfWeekStr() {
return format(LocalDate.now(), "E");
}
/**
38. 获取指定日期是星期几
39. 40. @param localDate 日期
41. @return String 星期几
*/
public static String getDayOfWeekStr(LocalDate localDate) {
String[] weekOfDays = {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
int dayOfWeek = localDate.getDayOfWeek().getValue() - 1;
return weekOfDays[dayOfWeek];
}
/**
42. 获取日期时间字符串
43. 44. @param temporal 需要转化的日期时间
45. @param pattern 时间格式
46. @return String 日期时间字符串,例如 2015-08-11 09:51:53
*/
public static String format(TemporalAccessor temporal, String pattern) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
return dateTimeFormatter.format(temporal);
}
/**
47. 日期时间字符串转换为日期时间(java.time.LocalDateTime)
48. 49. @param localDateTimeStr 日期时间字符串
50. @param pattern 日期时间格式 例如DATETIME_PATTERN
51. @return LocalDateTime 日期时间
*/
public static LocalDateTime parseLocalDateTime(String localDateTimeStr, String pattern) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
return LocalDateTime.parse(localDateTimeStr, dateTimeFormatter);
}
/**
52. 日期字符串转换为日期(java.time.LocalDate)
53. 54. @param localDateStr 日期字符串
55. @param pattern 日期格式 例如DATE_PATTERN
56. @return LocalDate 日期
*/
public static LocalDate parseLocalDate(String localDateStr, String pattern) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
return LocalDate.parse(localDateStr, dateTimeFormatter);
}
/**
57. 获取指定日期时间加上指定数量日期时间单位之后的日期时间.
58. 59. @param localDateTime 日期时间
60. @param num 数量
61. @param chronoUnit 日期时间单位
62. @return LocalDateTime 新的日期时间
*/
public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
return localDateTime.plus(num, chronoUnit);
}
/**
63. 获取指定日期时间减去指定数量日期时间单位之后的日期时间.
64. 65. @param localDateTime 日期时间
66. @param num 数量
67. @param chronoUnit 日期时间单位
68. @return LocalDateTime 新的日期时间
*/
public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
return localDateTime.minus(num, chronoUnit);
}
/**
69. 根据ChronoUnit计算两个日期时间之间相隔日期时间
70. 71. @param start 开始日期时间
72. @param end 结束日期时间
73. @param chronoUnit 日期时间单位
74. @return long 相隔日期时间
*/
public static long getChronoUnitBetween(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) {
return Math.abs(start.until(end, chronoUnit));
}
/**
75. 根据ChronoUnit计算两个日期之间相隔年数或月数或天数
76. 77. @param start 开始日期
78. @param end 结束日期
79. @param chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS)
80. @return long 相隔年数或月数或周数或天数
*/
public static long getChronoUnitBetween(LocalDate start, LocalDate end, ChronoUnit chronoUnit) {
return Math.abs(start.until(end, chronoUnit));
}
/**
81. 获取本年第一天的日期字符串
82. 83. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getFirstDayOfYearStr() {
return getFirstDayOfYearStr(LocalDateTime.now());
}
/**
84. 获取本年最后一天的日期字符串
85. 86. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfYearStr() {
return getLastDayOfYearStr(LocalDateTime.now());
}
/**
87. 获取指定日期当年第一天的日期字符串
88. 89. @param localDateTime 指定日期时间
90. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getFirstDayOfYearStr(LocalDateTime localDateTime) {
return getFirstDayOfYearStr(localDateTime, DATETIME_PATTERN);
}
/**
91. 获取指定日期当年最后一天的日期字符串
92. 93. @param localDateTime 指定日期时间
94. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfYearStr(LocalDateTime localDateTime) {
return getLastDayOfYearStr(localDateTime, DATETIME_PATTERN);
}
/**
95. 获取指定日期当年第一天的日期字符串,带日期格式化参数
96. 97. @param localDateTime 指定日期时间
98. @param pattern 日期时间格式
99. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getFirstDayOfYearStr(LocalDateTime localDateTime, String pattern) {
return format(localDateTime.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0), pattern);
}
/**
100. 获取指定日期当年最后一天的日期字符串,带日期格式化参数
101. 102. @param localDateTime 指定日期时间
103. @param pattern 日期时间格式
104. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfYearStr(LocalDateTime localDateTime, String pattern) {
return format(localDateTime.with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59), pattern);
}
/**
105. 获取本月第一天的日期字符串
106. 107. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getFirstDayOfMonthStr() {
return getFirstDayOfMonthStr(LocalDateTime.now());
}
/**
108. 获取本月最后一天的日期字符串
109. 110. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfMonthStr() {
return getLastDayOfMonthStr(LocalDateTime.now());
}
/**
111. 获取指定日期当月第一天的日期字符串
112. 113. @param localDateTime 指定日期时间
114. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getFirstDayOfMonthStr(LocalDateTime localDateTime) {
return getFirstDayOfMonthStr(localDateTime, DATETIME_PATTERN);
}
/**
115. 获取指定日期当月最后一天的日期字符串
116. 117. @param localDateTime 指定日期时间
118. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfMonthStr(LocalDateTime localDateTime) {
return getLastDayOfMonthStr(localDateTime, DATETIME_PATTERN);
}
/**
119. 获取指定日期当月第一天的日期字符串,带日期格式化参数
120. 121. @param localDateTime 指定日期时间
122. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getFirstDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
return format(localDateTime.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0), pattern);
}
/**
123. 获取指定日期当月最后一天的日期字符串,带日期格式化参数
124. 125. @param localDateTime 指定日期时间
126. @param pattern 日期时间格式
127. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
return format(localDateTime.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59), pattern);
}
/**
128. 获取本周第一天的日期字符串
129. 130. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getFirstDayOfWeekStr() {
return getFirstDayOfWeekStr(LocalDateTime.now());
}
/**
131. 获取本周最后一天的日期字符串
132. 133. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfWeekStr() {
return getLastDayOfWeekStr(LocalDateTime.now());
}
/**
134. 获取指定日期当周第一天的日期字符串,这里第一天为周一
135. 136. @param localDateTime 指定日期时间
137. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getFirstDayOfWeekStr(LocalDateTime localDateTime) {
return getFirstDayOfWeekStr(localDateTime, DATETIME_PATTERN);
}
/**
138. 获取指定日期当周最后一天的日期字符串,这里最后一天为周日
139. 140. @param localDateTime 指定日期时间
141. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfWeekStr(LocalDateTime localDateTime) {
return getLastDayOfWeekStr(localDateTime, DATETIME_PATTERN);
}
/**
142. 获取指定日期当周第一天的日期字符串,这里第一天为周一,带日期格式化参数
143. 144. @param localDateTime 指定日期时间
145. @param pattern 日期时间格式
146. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getFirstDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
return format(localDateTime.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0), pattern);
}
/**
147. 获取指定日期当周最后一天的日期字符串,这里最后一天为周日,带日期格式化参数
148. 149. @param localDateTime 指定日期时间
150. @param pattern 日期时间格式
151. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getLastDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
return format(localDateTime.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59), pattern);
}
/**
152. 获取今天开始时间的日期字符串
153. 154. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getStartTimeOfDayStr() {
return getStartTimeOfDayStr(LocalDateTime.now());
}
/**
155. 获取今天结束时间的日期字符串
156. 157. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getEndTimeOfDayStr() {
return getEndTimeOfDayStr(LocalDateTime.now());
}
/**
158. 获取指定日期开始时间的日期字符串
159. 160. @param localDateTime 指定日期时间
161. @return String 格式:yyyy-MM-dd 00:00:00
*/
public static String getStartTimeOfDayStr(LocalDateTime localDateTime) {
return getStartTimeOfDayStr(localDateTime, DATETIME_PATTERN);
}
/**
162. 获取指定日期结束时间的日期字符串
163. 164. @param localDateTime 指定日期时间
165. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getEndTimeOfDayStr(LocalDateTime localDateTime) {
return getEndTimeOfDayStr(localDateTime, DATETIME_PATTERN);
}
/**
166. 获取指定日期开始时间的日期字符串,带日期格式化参数
167. 168. @param localDateTime 指定日期时间
169. @param pattern 日期时间格式
170. @return String 格式:yyyy-MM-dd HH:mm:ss
*/
public static String getStartTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
return format(localDateTime.withHour(0).withMinute(0).withSecond(0), pattern);
}
/**
171. 获取指定日期结束时间的日期字符串,带日期格式化参数
172. 173. @param localDateTime 指定日期时间
174. @param pattern 日期时间格式
175. @return String 格式:yyyy-MM-dd 23:59:59
*/
public static String getEndTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
return format(localDateTime.withHour(23).withMinute(59).withSecond(59), pattern);
}
176. List item
/**
* 切割日期。按照周期切割成小段日期段。例如: <br>
*
* @param startDate 开始日期(yyyy-MM-dd)
* @param endDate 结束日期(yyyy-MM-dd)
* @param period 周期(天,周,月,年)
* @return 切割之后的日期集合
* <li>startDate="2019-02-28",endDate="2019-03-05",period="day"</li>
* <li>结果为:[2019-02-28, 2019-03-01, 2019-03-02, 2019-03-03, 2019-03-04, 2019-03-05]</li><br>
* <li>startDate="2019-02-28",endDate="2019-03-25",period="week"</li>
* <li>结果为:[2019-02-28,2019-03-06, 2019-03-07,2019-03-13, 2019-03-14,2019-03-20,
* 2019-03-21,2019-03-25]</li><br>
* <li>startDate="2019-02-28",endDate="2019-05-25",period="month"</li>
* <li>结果为:[2019-02-28,2019-02-28, 2019-03-01,2019-03-31, 2019-04-01,2019-04-30,
* 2019-05-01,2019-05-25]</li><br>
* <li>startDate="2019-02-28",endDate="2020-05-25",period="year"</li>
* <li>结果为:[2019-02-28,2019-12-31, 2020-01-01,2020-05-25]</li><br>
*/
public static List<String> listDateStrs(String startDate, String endDate, String period) {
List<String> result = new ArrayList<>();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN);
LocalDate end = LocalDate.parse(endDate, dateTimeFormatter);
LocalDate start = LocalDate.parse(startDate, dateTimeFormatter);
LocalDate tmp = start;
switch (period) {
case DAY:
while (start.isBefore(end) || start.isEqual(end)) {
result.add(start.toString());
start = start.plusDays(1);
}
break;
case WEEK:
while (tmp.isBefore(end) || tmp.isEqual(end)) {
if (tmp.plusDays(6).isAfter(end)) {
result.add(tmp.toString() + "," + end);
} else {
result.add(tmp.toString() + "," + tmp.plusDays(6));
}
tmp = tmp.plusDays(7);
}
break;
case MONTH:
while (tmp.isBefore(end) || tmp.isEqual(end)) {
LocalDate lastDayOfMonth = tmp.with(TemporalAdjusters.lastDayOfMonth());
if (lastDayOfMonth.isAfter(end)) {
result.add(tmp.toString() + "," + end);
} else {
result.add(tmp.toString() + "," + lastDayOfMonth);
}
tmp = lastDayOfMonth.plusDays(1);
}
break;
case YEAR:
while (tmp.isBefore(end) || tmp.isEqual(end)) {
LocalDate lastDayOfYear = tmp.with(TemporalAdjusters.lastDayOfYear());
if (lastDayOfYear.isAfter(end)) {
result.add(tmp.toString() + "," + end);
} else {
result.add(tmp.toString() + "," + lastDayOfYear);
}
tmp = lastDayOfYear.plusDays(1);
}
break;
default:
break;
}
return result;
}
/**
* 将localDateTime转为时间戳
*/
public static Long getStampByLocalTime(LocalDateTime localDateTime) {
return localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
}
public static Long getStampByLocalTime(String time, String pattern) {
LocalDateTime localDateTime = getTodayDateTimeByTime(time, pattern);
return localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
}
public static LocalDateTime getTodayDateTimeByTime(String time, String pattern) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
LocalTime localTime = LocalTime.parse(time, dtf);
LocalDate localDate = LocalDate.now();
return LocalDateTime.of(localDate, localTime);
}
public static Long getMonthFirstDayStamp(LocalDateTime localDateTime){
LocalDateTime firstLocalDateTime = LocalDateTime.of(LocalDate.from(localDateTime.with(TemporalAdjusters.firstDayOfMonth())), LocalTime.MIN);
return DateUtils.getStampByLocalTime(firstLocalDateTime);
}
/**
* 获取当月最后一天的时间戳
*/
public static Long getMonthLastDayStamp(LocalDateTime localDateTime) {
LocalDateTime firstLocalDateTime = LocalDateTime.of(LocalDate.from(localDateTime.with(TemporalAdjusters.lastDayOfMonth())), LocalTime.MAX);
return getStampByLocalTime(firstLocalDateTime);
}
/**
* 一年的第几周,7标识一周需要满足多少天,为了跨年计算
*/
public static int getWeekOfYear(LocalDateTime localDateTime) {
WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY, 7);
return localDateTime.get(weekFields.weekOfWeekBasedYear());
}
}