潘志宝
2024-10-29 a2aa90efc5d75798b0b3dc3255c33c53983dce86
提交 | 用户 | 时间
e7c126 1 package com.iailab.framework.common.util.date;
H 2
3 import cn.hutool.core.date.LocalDateTimeUtil;
d9f9ba 4 import org.joda.time.DateTime;
e7c126 5
d9f9ba 6 import java.text.ParseException;
H 7 import java.text.SimpleDateFormat;
e7c126 8 import java.time.*;
d9f9ba 9 import java.util.ArrayList;
e7c126 10 import java.util.Calendar;
H 11 import java.util.Date;
d9f9ba 12 import java.util.List;
e7c126 13
H 14 /**
15  * 时间工具类
16  *
17  * @author iailab
18  */
19 public class DateUtils {
20
21     /**
22      * 时区 - 默认
23      */
24     public static final String TIME_ZONE_DEFAULT = "GMT+8";
25
26     /**
27      * 秒转换成毫秒
28      */
29     public static final long SECOND_MILLIS = 1000;
30
31     public static final String FORMAT_YEAR_MONTH_DAY = "yyyy-MM-dd";
449017 32     /** 时间格式(yyyy.MM.dd) */
D 33     public final static String DATE_PATTERN_POINT = "yyyy.MM.dd";
e7c126 34
H 35     public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss";
d9f9ba 36
449017 37     public final static String DATE_TIME_PATTERN_STRING = "yyyyMMddHHmmss";
D 38
d9f9ba 39     /**
H 40      * 日期格式化 日期格式为:yyyy-MM-dd
41      * @param date  日期
42      * @return  返回yyyy-MM-dd格式日期
43      */
44     public static String format(Date date) {
45         return format(date, FORMAT_YEAR_MONTH_DAY);
46     }
47
48     /**
49      * 日期格式化 日期格式为:yyyy-MM-dd
50      * @param date  日期
51      * @param pattern  格式,如:DateUtils.DATE_TIME_PATTERN
52      * @return  返回yyyy-MM-dd格式日期
53      */
54     public static String format(Date date, String pattern) {
55         if(date != null){
56             SimpleDateFormat df = new SimpleDateFormat(pattern);
57             return df.format(date);
58         }
59         return null;
60     }
61
62     /**
63      * 日期解析
64      * @param date  日期
65      * @param pattern  格式,如:DateUtils.DATE_TIME_PATTERN
66      * @return  返回Date
67      */
68     public static Date parse(String date, String pattern) {
69         try {
70             return new SimpleDateFormat(pattern).parse(date);
71         } catch (ParseException e) {
72             e.printStackTrace();
73         }
74         return null;
75     }
e7c126 76
H 77     /**
78      * 将 LocalDateTime 转换成 Date
79      *
80      * @param date LocalDateTime
81      * @return LocalDateTime
82      */
83     public static Date of(LocalDateTime date) {
84         if (date == null) {
85             return null;
86         }
87         // 将此日期时间与时区相结合以创建 ZonedDateTime
88         ZonedDateTime zonedDateTime = date.atZone(ZoneId.systemDefault());
89         // 本地时间线 LocalDateTime 到即时时间线 Instant 时间戳
90         Instant instant = zonedDateTime.toInstant();
91         // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
92         return Date.from(instant);
93     }
94
95     /**
96      * 将 Date 转换成 LocalDateTime
97      *
98      * @param date Date
99      * @return LocalDateTime
100      */
101     public static LocalDateTime of(Date date) {
102         if (date == null) {
103             return null;
104         }
105         // 转为时间戳
106         Instant instant = date.toInstant();
107         // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
108         return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
109     }
110
111     public static Date addTime(Duration duration) {
112         return new Date(System.currentTimeMillis() + duration.toMillis());
113     }
114
115     public static boolean isExpired(LocalDateTime time) {
116         LocalDateTime now = LocalDateTime.now();
117         return now.isAfter(time);
118     }
119
120     /**
121      * 创建指定时间
122      *
123      * @param year  年
124      * @param mouth 月
125      * @param day   日
126      * @return 指定时间
127      */
128     public static Date buildTime(int year, int mouth, int day) {
129         return buildTime(year, mouth, day, 0, 0, 0);
130     }
131
132     /**
133      * 创建指定时间
134      *
135      * @param year   年
136      * @param mouth  月
137      * @param day    日
138      * @param hour   小时
139      * @param minute 分钟
140      * @param second 秒
141      * @return 指定时间
142      */
143     public static Date buildTime(int year, int mouth, int day,
144                                  int hour, int minute, int second) {
145         Calendar calendar = Calendar.getInstance();
146         calendar.set(Calendar.YEAR, year);
147         calendar.set(Calendar.MONTH, mouth - 1);
148         calendar.set(Calendar.DAY_OF_MONTH, day);
149         calendar.set(Calendar.HOUR_OF_DAY, hour);
150         calendar.set(Calendar.MINUTE, minute);
151         calendar.set(Calendar.SECOND, second);
152         calendar.set(Calendar.MILLISECOND, 0); // 一般情况下,都是 0 毫秒
153         return calendar.getTime();
154     }
155
156     public static Date max(Date a, Date b) {
157         if (a == null) {
158             return b;
159         }
160         if (b == null) {
161             return a;
162         }
163         return a.compareTo(b) > 0 ? a : b;
164     }
165
166     public static LocalDateTime max(LocalDateTime a, LocalDateTime b) {
167         if (a == null) {
168             return b;
169         }
170         if (b == null) {
171             return a;
172         }
173         return a.isAfter(b) ? a : b;
174     }
175
176     /**
177      * 是否今天
178      *
179      * @param date 日期
180      * @return 是否
181      */
182     public static boolean isToday(LocalDateTime date) {
183         return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now());
184     }
185
186     /**
187      * 是否昨天
188      *
189      * @param date 日期
190      * @return 是否
191      */
192     public static boolean isYesterday(LocalDateTime date) {
193         return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now().minusDays(1));
194     }
195
d9f9ba 196     public static List<String> getTimeScale(Date startDate, Date endDate, int seconds) {
H 197         List<String> days = new ArrayList<String>();
198         Calendar calendar = Calendar.getInstance();
199         calendar.setTime(startDate);
200         while (calendar.getTime().compareTo(endDate) <= 0) {
a2aa90 201             days.add(DateUtils.format(calendar.getTime(), FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
d9f9ba 202             calendar.add(Calendar.SECOND, seconds);
H 203         }
204         return days;
205     }
206
207     /**
208      * 对日期的【秒】进行加/减
209      *
210      * @param date 日期
211      * @param seconds 秒数,负数为减
212      * @return 加/减几秒后的日期
213      */
214     public static Date addDateSeconds(Date date, int seconds) {
215         DateTime dateTime = new DateTime(date);
216         return dateTime.plusSeconds(seconds).toDate();
217     }
218
219     /**
220      * 对日期的【分钟】进行加/减
221      *
222      * @param date 日期
223      * @param minutes 分钟数,负数为减
224      * @return 加/减几分钟后的日期
225      */
226     public static Date addDateMinutes(Date date, int minutes) {
227         DateTime dateTime = new DateTime(date);
228         return dateTime.plusMinutes(minutes).toDate();
229     }
230
231     /**
232      * 对日期的【小时】进行加/减
233      *
234      * @param date 日期
235      * @param hours 小时数,负数为减
236      * @return 加/减几小时后的日期
237      */
238     public static Date addDateHours(Date date, int hours) {
239         DateTime dateTime = new DateTime(date);
240         return dateTime.plusHours(hours).toDate();
241     }
242
243     /**
244      * 对日期的【天】进行加/减
245      *
246      * @param date 日期
247      * @param days 天数,负数为减
248      * @return 加/减几天后的日期
249      */
250     public static Date addDateDays(Date date, int days) {
251         DateTime dateTime = new DateTime(date);
252         return dateTime.plusDays(days).toDate();
253     }
254
255     /**
256      * 对日期的【周】进行加/减
257      *
258      * @param date 日期
259      * @param weeks 周数,负数为减
260      * @return 加/减几周后的日期
261      */
262     public static Date addDateWeeks(Date date, int weeks) {
263         DateTime dateTime = new DateTime(date);
264         return dateTime.plusWeeks(weeks).toDate();
265     }
266
267     /**
268      * 对日期的【月】进行加/减
269      *
270      * @param date 日期
271      * @param months 月数,负数为减
272      * @return 加/减几月后的日期
273      */
274     public static Date addDateMonths(Date date, int months) {
275         DateTime dateTime = new DateTime(date);
276         return dateTime.plusMonths(months).toDate();
277     }
278
279     /**
280      * 对日期的【年】进行加/减
281      *
282      * @param date 日期
283      * @param years 年数,负数为减
284      * @return 加/减几年后的日期
285      */
286     public static Date addDateYears(Date date, int years) {
287         DateTime dateTime = new DateTime(date);
288         return dateTime.plusYears(years).toDate();
289     }
290
e7c126 291 }