5
5
import java .time .*;
6
6
import java .time .format .DateTimeFormatter ;
7
7
import java .time .temporal .ChronoField ;
8
+ import java .time .temporal .ChronoUnit ;
8
9
import java .time .temporal .TemporalAdjusters ;
10
+ import java .util .Calendar ;
9
11
import java .util .Date ;
10
12
11
13
/**
15
17
*/
16
18
public class DateUtil {
17
19
/**
18
- * 例如: 2018-12-28
20
+ * 例如: 2018-12-28
19
21
*/
20
22
public static final String DATE = "yyyy-MM-dd" ;
23
+
21
24
/**
22
- * 例如: 2018-12-28 10:00:00
25
+ * 例如: 2018-12-28 10:00:00
23
26
*/
24
27
public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss" ;
28
+
29
+ /**
30
+ * 例如:10:00:00
31
+ */
32
+ public static final String TIME = "HH:mm:ss" ;
33
+
25
34
/**
26
- * 例如:10:00:00
35
+ * 例如:10_00_00
27
36
*/
28
- public static final String TIME = "HHmmss" ;
37
+ public static final String TIME_WITH_UNDERLINE = "HH_mm_ss" ;
38
+
29
39
/**
30
- * 例如: 10:00
40
+ * 例如: 10:00
31
41
*/
32
42
public static final String TIME_WITHOUT_SECOND = "HH:mm" ;
33
43
34
44
/**
35
- * 例如: 2018-12-28 10:00
45
+ * 例如: 2018-12-28 10:00
36
46
*/
37
47
public static final String DATE_TIME_WITHOUT_SECONDS = "yyyy-MM-dd HH:mm" ;
38
48
49
+ /**
50
+ * 例如:2018-06-08T10:34:56+08:00
51
+ */
52
+ public static final String RFC3339 = "yyyy-MM-dd'T'HH:mm:ssXXX" ;
53
+
54
+ /**
55
+ * 生肖
56
+ */
57
+ public static final String [] ZODIAC_ARRAY = {"猴" , "鸡" , "狗" , "猪" , "鼠" , "牛" , "虎" , "兔" , "龙" , "蛇" , "马" , "羊" };
58
+
59
+ /**
60
+ * 星座
61
+ */
62
+ public static final String [] CONSTELLATION_ARRAY = {"水瓶座" , "双鱼座" , "白羊座" , "金牛座" , "双子座" , "巨蟹座" , "狮子座" , "处女座" , "天秤座" , "天蝎座" , "射手座" , "魔羯座" };
63
+
64
+ /**
65
+ * 月份-天
66
+ */
67
+ public static final int [] CONSTELLATION_EDGE_DAY = {20 , 19 , 21 , 21 , 21 , 22 , 23 , 23 , 23 , 23 , 22 , 22 };
39
68
40
69
/**
41
70
* 获取年
@@ -94,14 +123,16 @@ public static Date parse(String dateStr, String pattern) {
94
123
}
95
124
96
125
/**
97
- * 解析字符串日期为LocalDateTime
126
+ * 为Date增加秒数,减传负数
98
127
*
99
- * @param dateStr 日期字符串
100
- * @param pattern 格式
101
- * @return LocalDateTime
128
+ * @param date 日期
129
+ * @param plusSeconds 要增加的秒数
130
+ * @return 新的日期
102
131
*/
103
- public static LocalDateTime parseLocalDateTime (String dateStr , String pattern ) {
104
- return LocalDateTime .parse (dateStr , DateTimeFormatter .ofPattern (pattern ));
132
+ public static Date addSeconds (Date date , Long plusSeconds ) {
133
+ LocalDateTime dateTime = LocalDateTime .ofInstant (date .toInstant (), ZoneId .systemDefault ());
134
+ LocalDateTime newDateTime = dateTime .plusSeconds (plusSeconds );
135
+ return Date .from (newDateTime .atZone (ZoneId .systemDefault ()).toInstant ());
105
136
}
106
137
107
138
/**
@@ -146,26 +177,26 @@ public static Instant addSeconds(long duration) {
146
177
*/
147
178
public static Date getStartTime () {
148
179
LocalDateTime now = LocalDateTime .now ().withHour (0 ).withMinute (0 ).withSecond (0 );
149
- return localDateTime2Date (now );
180
+ return localDateTimeToDate (now );
150
181
}
151
182
152
183
/**
153
184
* @return 返回当天的结束时间
154
185
*/
155
186
public static Date getEndTime () {
156
187
LocalDateTime now = LocalDateTime .now ().withHour (23 ).withMinute (59 ).withSecond (59 ).withNano (999 );
157
- return localDateTime2Date (now );
188
+ return localDateTimeToDate (now );
158
189
}
159
190
160
191
/**
161
192
* 减月份
162
193
*
163
- * @param months 月份
194
+ * @param monthsToSubtract 月份
164
195
* @return Date
165
196
*/
166
- public static Date minusMonths (long months ) {
167
- LocalDate localDate = LocalDate .now ().minusMonths (months );
168
- return localDate2Date (localDate );
197
+ public static Date minusMonths (long monthsToSubtract ) {
198
+ LocalDate localDate = LocalDate .now ().minusMonths (monthsToSubtract );
199
+ return localDateToDate (localDate );
169
200
}
170
201
171
202
/**
@@ -187,7 +218,7 @@ public static long minusSeconds(long seconds) {
187
218
* @param localDate LocalDate object
188
219
* @return Date object
189
220
*/
190
- public static Date localDate2Date (LocalDate localDate ) {
221
+ public static Date localDateToDate (LocalDate localDate ) {
191
222
ZonedDateTime zonedDateTime = localDate .atStartOfDay (ZoneId .systemDefault ());
192
223
return Date .from (zonedDateTime .toInstant ());
193
224
}
@@ -198,7 +229,7 @@ public static Date localDate2Date(LocalDate localDate) {
198
229
* @param localDateTime LocalDateTime object
199
230
* @return Date object
200
231
*/
201
- public static Date localDateTime2Date (LocalDateTime localDateTime ) {
232
+ public static Date localDateTimeToDate (LocalDateTime localDateTime ) {
202
233
return Date .from (localDateTime .atZone (ZoneId .systemDefault ()).toInstant ());
203
234
}
204
235
@@ -214,7 +245,7 @@ public static String getFirstDayOfCurrentYear(String pattern) {
214
245
pattern = "yyyyMMdd" ;
215
246
}
216
247
217
- return format (localDateTime2Date (localDateTime ), pattern );
248
+ return format (localDateTimeToDate (localDateTime ), pattern );
218
249
}
219
250
220
251
/**
@@ -228,7 +259,7 @@ public static String getLastMonthFirstDayOfPreviousYear(String pattern) {
228
259
if (!StringUtils .hasText (pattern )) {
229
260
pattern = "yyyyMMdd" ;
230
261
}
231
- return format (localDateTime2Date (localDateTime ), pattern );
262
+ return format (localDateTimeToDate (localDateTime ), pattern );
232
263
}
233
264
234
265
/**
@@ -242,7 +273,7 @@ public static String getLastMonthLastDayOfPreviousYear(String pattern) {
242
273
if (!StringUtils .hasText (pattern )) {
243
274
pattern = "yyyyMMdd" ;
244
275
}
245
- return format (localDateTime2Date (localDateTime ), pattern );
276
+ return format (localDateTimeToDate (localDateTime ), pattern );
246
277
}
247
278
248
279
/**
@@ -256,6 +287,100 @@ public static String getCurrentDay(String pattern) {
256
287
if (!StringUtils .hasText (pattern )) {
257
288
pattern = "yyyyMMdd" ;
258
289
}
259
- return format (localDateTime2Date (localDateTime ), pattern );
290
+ return format (localDateTimeToDate (localDateTime ), pattern );
291
+ }
292
+
293
+ /**
294
+ * 获取本月所对应的月初时间
295
+ *
296
+ * @return 月初时间
297
+ */
298
+ public static Date getFirstDate () {
299
+ LocalDateTime now = LocalDateTime .now ();
300
+ LocalDateTime firstDate = now .withDayOfMonth (1 ).truncatedTo (ChronoUnit .DAYS );
301
+ return localDateTimeToDate (firstDate );
302
+ }
303
+
304
+ /**
305
+ * 获取本月所对应的月末时间
306
+ *
307
+ * @return 月末时间
308
+ */
309
+ public static Date getLastDate () {
310
+ LocalDateTime now = LocalDateTime .now ();
311
+ LocalDateTime endDate = now .plusMonths (1L ).withDayOfMonth (1 ).truncatedTo (ChronoUnit .DAYS ).plus (-1L , ChronoUnit .MILLIS );
312
+ return localDateTimeToDate (endDate );
313
+ }
314
+
315
+ /**
316
+ * 根据日期获取生肖
317
+ *
318
+ * @param date 日期
319
+ * @return 生肖
320
+ */
321
+ public static String getZodiac (Date date ) {
322
+ Calendar calendar = Calendar .getInstance ();
323
+ calendar .setTime (date );
324
+ return ZODIAC_ARRAY [calendar .get (Calendar .YEAR ) % 12 ];
325
+ }
326
+
327
+ /**
328
+ * 根据日期获取星座
329
+ *
330
+ * @param date 日期
331
+ * @return 星座
332
+ */
333
+ public static String getConstellation (Date date ) {
334
+ Calendar calendar = Calendar .getInstance ();
335
+ calendar .setTime (date );
336
+ int month = calendar .get (Calendar .MONTH );
337
+ int day = calendar .get (Calendar .DAY_OF_MONTH );
338
+ if (day < CONSTELLATION_EDGE_DAY [month ]) {
339
+ month = month - 1 ;
340
+ }
341
+ if (month >= 0 ) {
342
+ return CONSTELLATION_ARRAY [month ];
343
+ }
344
+ return CONSTELLATION_ARRAY [11 ];
345
+ }
346
+
347
+ /**
348
+ * 判断当前时间是否位于开始时间与结束时间之间
349
+ *
350
+ * @param date 当前时间
351
+ * @param start 开始时间
352
+ * @param end 结束时间
353
+ * @return true || false
354
+ */
355
+ public static Boolean isInTimeLine (Date date , Date start , Date end ) {
356
+ long time = date .getTime ();
357
+ long startTime = start .getTime ();
358
+ long endTime = end .getTime ();
359
+ return time > startTime && time < endTime ;
360
+ }
361
+
362
+ /**
363
+ * 判断某个时间是否超过当前时间
364
+ *
365
+ * @param date 开始时间
366
+ * @param period 秒数
367
+ * @return true || false
368
+ */
369
+ public static Boolean isOutOfDate (Date date , Long period ) {
370
+ long time = addSeconds (date , period ).getTime ();
371
+ long now = Calendar .getInstance ().getTimeInMillis ();
372
+ return now >= time ;
373
+ }
374
+
375
+ /**
376
+ * 判断过期时间是否超过当前时间
377
+ *
378
+ * @param expiredTime 过期时间
379
+ * @return true || false
380
+ */
381
+ public static Boolean isOutOfDate (Date expiredTime ) {
382
+ long time = expiredTime .getTime ();
383
+ long now = Calendar .getInstance ().getTimeInMillis ();
384
+ return now >= time ;
260
385
}
261
386
}
0 commit comments