关于Java日期类,日历类以及时间工具类
Date 类
Date 类表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。
1. 构造方法
Date 类有如下两个构造方法。
- Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。
- Date(long date):此种形式表示从 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0 秒开始经过参数 date 指定的毫秒数。
这两个构造方法的使用示例如下:
- Date date1 = new Date(); // 调用无参数构造函数
- System.out.println(date1.toString()); // 输出:Wed May 18 21:24:40 CST 2016
- Date date2 = new Date(60000); // 调用含有一个long类型参数的构造函数
- System.out.println(date2); // 输出:Thu Jan 0108:01:00 CST 1970
Date 类的无参数构造方法获取的是系统当前的时间,显示的顺序为星期、月、日、小时、分、秒、年。
Date 类带 long 类型参数的构造方法获取的是距离 GMT 指定毫秒数的时间,60000 毫秒是一分钟,而 GMT(格林尼治标准时间)与 CST(中央标准时间)相差 8 小时,也就是说 1970 年 1 月 1 日 00:00:00 GMT 与 1970 年 1 月 1 日 08:00:00 CST 表示的是同一时间。 因此距离 1970 年 1 月 1 日 00:00:00 CST 一分钟的时间为 1970 年 1 月 1 日 00:01:00 CST,即使用 Date 对象表示为 Thu Jan 01 08:01:00 CST 1970。
常用方法
Date 类提供了许多与日期和事件相关的方法,其中常见的方法如表 1 所示。
| 方法 | 描述 |
|---|---|
| boolean after(Date when) | 判断此日期是否在指定日期之后 |
| boolean before(Date when) | 判断此日期是否在指定日期之前 |
| int compareTo(Date anotherDate) | 比较两个日期的顺序 |
| boolean equals(Object obj) | 比较两个日期的相等性 |
| long getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来,此 Date 对象表示的毫秒数 |
| String toString() | 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy。 其中 dow 是一周中的某一天(Sun、Mon、Tue、Wed、Thu、Fri 及 Sat) |
例 1
下面使用一个实例来具体演示 Date 类的使用。假设,某一天特定时间要去做一件事,而且那个时间已经过去一分钟之后才想起来这件事还没有办,这时系统将会提示已经过去了多 长时间。具体的代码如下:
1 import java.util.Date;
2 import java.util.Scanner;
3 public class Test11 {
4 public static void main(String[] args) {
5 Scanner input = new Scanner(System.in);
6 System.out.println("请输入要做的事情:");
7 String title = input.next();
8 Date date1 = new Date(); // 获取当前日期
9 System.out.println("[" + title + "] 这件事发生时间为:" + date1);
10 try {
11 Thread.sleep(60000);// 暂停 1 分钟
12 } catch (InterruptedException e) {
13 e.printStackTrace();
14 }
15 Date date2 = new Date();
16 System.out.println("现在时间为:" + date2);
17 if (date2.before(date1)) {
18 System.out.println("你还有 " + (date2.getTime() - date1.getTime()) / 1000 + " 秒需要去完成【" + title + "】这件事!");
19 } else {
20 System.out.println("【" + title + "】事情已经过去了 " + (date2.getTime() - date1.getTime()) / 1000 + " 秒");
21 }
22 }
23 }
在该程序中,分别使用 Date 类的无参数构造方法创建了两个 Date 对象。在创建完第一个 Date 对象后,使用 Thread.sleep() 方法让程序休眠 60 秒,然后再创建第二个 Date 对象,这样第二个 Date 对象所表示的时间将会在第一个 Date 对象所表示时间之后,因此“date2.before(date1)”条件表达式不成立,从而执行 else 块中的代码,表示事情已经发生过。
运行该程序,执行结果如下所示。
请输入要做的事情:
收快递
【收快递】这件事发生时间为:Fri Oct 12 11:11:07 CST 2018
现在时间为:Fri Oct 12 11:12:07 CST 2018
【收快递】事情已经过去了 60 秒
Calendar 类
Calendar 类是一个抽象类,它为特定瞬间与 YEAR、MONTH、DAY_OF—MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。
创建 Calendar 对象不能使用 new 关键字,因为 Calendar 类是一个抽象类,但是它提供了一个 getInstance() 方法来获得 Calendar类的对象。getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。
1 Calendar c = Calendar.getInstance();
当创建了一个 Calendar 对象后,就可以通过 Calendar 对象中的一些方法来处理日期、时间。Calendar 类的常用方法如表 2 所示。
| 方法 | 描述 |
|---|---|
| void add(int field, int amount) | 根据日历的规则,为给定的日历字段 field 添加或减去指定的时间量 amount |
| boolean after(Object when) | 判断此 Calendar 表示的时间是否在指定时间 when 之后,并返回判断结果 |
| boolean before(Object when) | 判断此 Calendar 表示的时间是否在指定时间 when 之前,并返回判断结果 |
| void clear() | 清空 Calendar 中的日期时间值 |
| int compareTo(Calendar anotherCalendar) | 比较两个 Calendar 对象表示的时间值(从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量),大则返回 1,小则返回 -1,相等返回 0 |
| int get(int field) | 返回指定日历字段的值 |
| int getActualMaximum(int field) | 返回指定日历字段可能拥有的最大值 |
| int getActualMinimum(int field) | 返回指定日历字段可能拥有的最小值 |
| int getFirstDayOfWeek() | 获取一星期的第一天。根据不同的国家地区,返回不同的值 |
| static Calendar getInstance() | 使用默认时区和语言坏境获得一个日历 |
| static Calendar getInstance(TimeZone zone) | 使用指定时区和默认语言环境获得一个日历 |
| static Calendar getInstance(TimeZone zone, Locale aLocale) |
使用指定时区和语言环境获得一个日历 |
| Date getTime() | 返回一个表示此 Calendar 时间值(从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量)的 Date 对象 |
| long getTimeInMillis() | 返回此 Calendar 的时间值,以毫秒为单位 |
| void set(int field, int value) | 为指定的日历字段设置给定值 |
| void set(int year, int month, int date) | 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
| void set(int year, int month, int date, int hourOfDay, int minute, int second) |
设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、 MINUTE 和 SECOND 的值 |
| void setFirstDayOfWeek(int value) | 设置一星期的第一天是哪一天 |
| void setTimeInMillis(long millis) | 用给定的 long 值设置此 Calendar 的当前时间值 |
Calendar 对象可以调用 set() 方法将日历翻到任何一个时间,当参数 year 取负数时表示公元前。Calendar 对象调用 get() 方法可以获取有关年、月、日等时间信息,参数 field 的有效值由 Calendar 静态常量指定。
Calendar 类中定义了许多常量,分别表示不同的意义。
- Calendar.YEAR:年份。
- Calendar.MONTH:月份。
- Calendar.DATE:日期。
- Calendar.DAY_OF_MONTH:日期,和上面的字段意义完全相同。
- Calendar.HOUR:12小时制的小时。
- Calendar.HOUR_OF_DAY:24 小时制的小时。
- Calendar.MINUTE:分钟。
- Calendar.SECOND:秒。
- Calendar.DAY_OF_WEEK:星期几。
例如,要获取当前月份可用如下代码:
int month = Calendar.getInstance().get(Calendar.MONTH);
如果整型变量 month 的值是 0,表示当前日历是在 1 月份;如果值是 11,则表示当前日历在 12 月份。
使用 Calendar 类处理日期时间的实例如下:
Calendar calendar = Calendar.getInstance(); // 如果不设置时间,则默认为当前时间
calendar.setTime(new Date()); // 将系统当前时间赋值给 Calendar 对象
System.out.println("现在时刻:" + calendar.getTime()); // 获取当前时间
int year = calendar.get(Calendar.YEAR); // 获取当前年份
System.out.println("现在是" + year + "年");
int month = calendar.get(Calendar.MONTH) + 1; // 获取当前月份(月份从 0 开始,所以加 1)
System.out.print(month + "月");
int day = calendar.get(Calendar.DATE); // 获取日
System.out.print(day + "日");
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 获取今天星期几(以星期日为第一天)
System.out.print("星期" + week);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前小时数(24 小时制)
System.out.print(hour + "时");
int minute = calendar.get(Calendar.MINUTE); // 获取当前分钟
System.out.print(minute + "分");
int second = calendar.get(Calendar.SECOND); // 获取当前秒数
System.out.print(second + "秒");
int millisecond = calendar.get(Calendar.MILLISECOND); // 获取毫秒数
System.out.print(millisecond + "毫秒");
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 获取今天是本月第几天
System.out.println("今天是本月的第 " + dayOfMonth + " 天");
int dayOfWeekInMonth = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH); // 获取今天是本月第几周
System.out.println("今天是本月第 " + dayOfWeekInMonth + " 周");
int many = calendar.get(Calendar.DAY_OF_YEAR); // 获取今天是今年第几天
System.out.println("今天是今年第 " + many + " 天");
Calendar c = Calendar.getInstance();
c.set(2012, 8, 8); // 设置年月日,时分秒将默认采用当前值
System.out.println("设置日期为 2012-8-8 后的时间:" + c.getTime()); // 输出时间
获取时间工具类
获取当前时间时间戳(long);
获取当前日期,包含时分秒(yyyy-MM-dd HH:mm:ss);
获取当前日期,不包含时分秒(yyyy-MM-dd);
得到两个时间差 格式yyyy-MM-dd HH:mm:ss;
转化long值的日期时间戳为yyyy-MM-dd HH:mm:ss.SSS格式的日期;
获取当前日期是一个星期的第几天;
获取当前小时 :2019-08-23 17;
获取当前时间一个小时前 2019-08-23 16;
获取当前日期前一天 2019-08-22;
获取最近七天 2019-08-20(有时候用于查最近七天数据起始时间);
获取最近一个月 2019-07-20 (有时候用于查最近一个月数据起始时间);
获取最近三个月 2019-05-20 (有时候用于查最近三个月数据起始时间);
获取最近一年 2018-08-20 (有时候用于查最近一年数据起始时间);
获取今年月份数据list(比如当前月为8月,返回list中包含8个数据1-8);
获取今年季度数据list(比如当前月为8月,为一年中第三个季度,返回list中包含3个数据1-3);
1 package com.crazyang.utils.date;
2
3 import org.springframework.stereotype.Component;
4 import org.springframework.util.StringUtils;
5
6 import java.text.ParseException;
7 import java.text.SimpleDateFormat;
8 import java.util.*;
9
10 /**
11 * 日期工具类
12 *
13 * @author crazyang
14 */
15
16 @Component
17 public class DateUtils {
18
19 /**
20 * 获得当前日期 yyyy-MM-dd HH:mm:ss
21 *
22 * @return 2019-08-27 14:12:40
23 */
24 public static String getCurrentTime() {
25 // 小写的hh取得12小时,大写的HH取的是24小时
26 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
27 Date date = new Date();
28 return df.format(date);
29 }
30
31 /**
32 * 获取系统当前时间戳
33 *
34 * @return 1566889186583
35 */
36 public static String getSystemTime() {
37 String current = String.valueOf(System.currentTimeMillis());
38 return current;
39 }
40
41
42 /**
43 * 获取当前日期 yy-MM-dd
44 *
45 * @return 2019-08-27
46 */
47 public static String getDateByString() {
48 Date date = new Date();
49 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
50 return sdf.format(date);
51 }
52
53 /**
54 * 得到两个时间差 格式yyyy-MM-dd HH:mm:ss
55 *
56 * @param start 2019-06-27 14:12:40
57 * @param end 2019-08-27 14:12:40
58 * @return 5270400000
59 */
60 public static long dateSubtraction(String start, String end) {
61 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
62 try {
63 Date date1 = df.parse(start);
64 Date date2 = df.parse(end);
65 return date2.getTime() - date1.getTime();
66 } catch (ParseException e) {
67 e.printStackTrace();
68 return 0;
69 }
70 }
71
72 /**
73 * 得到两个时间差
74 *
75 * @param start 开始时间
76 * @param end 结束时间
77 * @return
78 */
79 public static long dateTogether(Date start, Date end) {
80 return end.getTime() - start.getTime();
81 }
82
83 /**
84 * 转化long值的日期为yyyy-MM-dd HH:mm:ss.SSS格式的日期
85 *
86 * @param millSec 日期long值 5270400000
87 * @return 日期,以yyyy-MM-dd HH:mm:ss.SSS格式输出 1970-03-03 08:00:00.000
88 */
89 public static String transferLongToDate(String millSec) {
90 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
91 Date date = new Date(Long.parseLong(millSec));
92 return sdf.format(date);
93 }
94
95 /**
96 * 获得当前日期 yyyy-MM-dd HH:mm:ss
97 *
98 * @return
99 */
100 public static String getOkDate(String date) {
101 try {
102 if (StringUtils.isEmpty(date)) {
103 return null;
104 }
105 Date date1 = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.ENGLISH).parse(date);
106 //格式化
107 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
108 return sdf.format(date1);
109 } catch (Exception e) {
110 e.printStackTrace();
111 }
112 return null;
113 }
114
115
116 /**
117 * 获取当前日期是一个星期的第几天
118 *
119 * @return 2
120 */
121 public static int getDayOfWeek() {
122 Calendar cal = Calendar.getInstance();
123 cal.setTime(new Date());
124 return cal.get(Calendar.DAY_OF_WEEK) - 1;
125 }
126
127
128 /**
129 * 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
130 *
131 * @param nowTime 当前时间
132 * @param dateSection 时间区间 2018-01-08,2019-09-09
133 * @return
134 * @author jqlin
135 */
136 public static boolean isEffectiveDate(Date nowTime, String dateSection) {
137 try {
138 String[] times = dateSection.split(",");
139 String format = "yyyy-MM-dd";
140 Date startTime = new SimpleDateFormat(format).parse(times[0]);
141 Date endTime = new SimpleDateFormat(format).parse(times[1]);
142 if (nowTime.getTime() == startTime.getTime()
143 || nowTime.getTime() == endTime.getTime()) {
144 return true;
145 }
146 Calendar date = Calendar.getInstance();
147 date.setTime(nowTime);
148
149 Calendar begin = Calendar.getInstance();
150 begin.setTime(startTime);
151
152 Calendar end = Calendar.getInstance();
153 end.setTime(endTime);
154
155 if (isSameDay(date, begin) || isSameDay(date, end)) {
156 return true;
157 }
158 if (date.after(begin) && date.before(end)) {
159 return true;
160 } else {
161 return false;
162 }
163 } catch (Exception e) {
164 e.printStackTrace();
165 return false;
166 }
167 }
168
169 public static boolean isSameDay(Calendar cal1, Calendar cal2) {
170 if (cal1 != null && cal2 != null) {
171 return cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6);
172 } else {
173 throw new IllegalArgumentException("The date must not be null");
174 }
175 }
176
177 public static long getTimeByDate(String time) {
178 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
179 try {
180 Date date = format.parse(time);
181 //日期转时间戳(毫秒)
182 return date.getTime();
183 } catch (Exception e) {
184 e.printStackTrace();
185 return 0;
186 }
187 }
188
189 /**
190 * 获取当前小时 :2019-08-23 17
191 *
192 * @return 2019-08-27 17
193 */
194 public static String getCurrentHour() {
195 GregorianCalendar calendar = new GregorianCalendar();
196 int hour = calendar.get(Calendar.HOUR_OF_DAY);
197 if (hour < 10) {
198 return DateUtils.getCurrentTime() + " 0" + hour;
199 }
200 return DateUtils.getDateByString() + " " + hour;
201 }
202
203 /**
204 * 获取当前时间一个小时前
205 * @return 2019-08-27 16
206 */
207 public static String getCurrentHourBefore() {
208 GregorianCalendar calendar = new GregorianCalendar();
209 int hour = calendar.get(Calendar.HOUR_OF_DAY);
210 if (hour > 0) {
211 hour = calendar.get(Calendar.HOUR_OF_DAY) - 1;
212 if (hour < 10) {
213 return DateUtils.getDateByString() + " 0" + hour;
214 }
215 return DateUtils.getDateByString() + " " + hour;
216 }
217 //获取当前日期前一天
218 return DateUtils.getBeforeDay() + " " + 23;
219 }
220
221 /**
222 * 获取当前日期前一天
223 *
224 * @return 2019-08-26
225 */
226 public static String getBeforeDay() {
227
228 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
229 Date date = new Date();
230 Calendar calendar = Calendar.getInstance();
231 calendar.setTime(date);
232 calendar.add(Calendar.DAY_OF_MONTH, -1);
233 date = calendar.getTime();
234 return sdf.format(date);
235 }
236
237
238 /**
239 * 获取最近七天
240 *
241 * @return 2019-08-20
242 */
243 public static String getServen() {
244 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
245
246 Calendar c = Calendar.getInstance();
247
248 c.add(Calendar.DATE, -7);
249
250 Date monday = c.getTime();
251
252 String preMonday = sdf.format(monday);
253
254 return preMonday;
255 }
256
257 /**
258 * 获取最近一个月
259 *
260 * @return 2019-07-27
261 */
262 public static String getOneMonth() {
263 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
264
265 Calendar c = Calendar.getInstance();
266
267 c.add(Calendar.MONTH, -1);
268
269 Date monday = c.getTime();
270
271 String preMonday = sdf.format(monday);
272
273 return preMonday;
274 }
275
276 /**
277 * 获取最近三个月
278 *
279 * @return 2019-05-27
280 */
281 public static String getThreeMonth() {
282 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
283
284 Calendar c = Calendar.getInstance();
285
286 c.add(Calendar.MONTH, -3);
287
288 Date monday = c.getTime();
289
290 String preMonday = sdf.format(monday);
291
292 return preMonday;
293 }
294
295 /**
296 * 获取最近一年
297 *
298 * @return 2018-08-27
299 */
300 public static String getOneYear() {
301 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
302 Calendar c = Calendar.getInstance();
303 c.add(Calendar.YEAR, -1);
304 Date start = c.getTime();
305 String startDay = sdf.format(start);
306 return startDay;
307 }
308
309
310 private static int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
311 /**
312 * 获取今年月份数据
313 * 说明 有的需求前端需要根据月份查询每月数据,此时后台给前端返回今年共有多少月份
314 *
315 * @return [1, 2, 3, 4, 5, 6, 7, 8]
316 */
317 public static List getMonthList(){
318 List list = new ArrayList();
319 for (int i = 1; i <= month; i++) {
320 list.add(i);
321 }
322 return list;
323 }
324
325 /**
326 * 返回当前年度季度list
327 * 本年度截止目前共三个季度,然后根据1,2,3分别查询相关起止时间
328 * @return [1, 2, 3]
329 */
330 public static List getQuartList(){
331 int quart = month / 3 + 1;
332 List list = new ArrayList();
333 for (int i = 1; i <= quart; i++) {
334 list.add(i);
335 }
336 return list;
337 }
338
339 public static void main(String[] args) {
340 System.out.println(DateUtils.getQuartList());
341 }
342 }
时间工具类(二)
1 /**
2 * Java8日期时间工具类
3 *
4 * @author JourWon
5 * @date 2020/12/13
6 */
7 public class LocalDateUtils {
8
9 /**
10 * 显示年月日时分秒,例如 2015-08-11 09:51:53.
11 */
12 public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
13
14 /**
15 * 仅显示年月日,例如 2015-08-11.
16 */
17 public static final String DATE_PATTERN = "yyyy-MM-dd";
18
19 /**
20 * 仅显示时分秒,例如 09:51:53.
21 */
22 public static final String TIME_PATTERN = "HH:mm:ss";
23
24 /**
25 * 显示年月日时分秒(无符号),例如 20150811095153.
26 */
27 public static final String UNSIGNED_DATETIME_PATTERN = "yyyyMMddHHmmss";
28
29 /**
30 * 仅显示年月日(无符号),例如 20150811.
31 */
32 public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";
33
34 /**
35 * 春天;
36 */
37 public static final Integer SPRING = 1;
38
39 /**
40 * 夏天;
41 */
42 public static final Integer SUMMER = 2;
43
44 /**
45 * 秋天;
46 */
47 public static final Integer AUTUMN = 3;
48
49 /**
50 * 冬天;
51 */
52 public static final Integer WINTER = 4;
53
54 /**
55 * 星期日;
56 */
57 public static final String SUNDAY = "星期日";
58
59 /**
60 * 星期一;
61 */
62 public static final String MONDAY = "星期一";
63
64 /**
65 * 星期二;
66 */
67 public static final String TUESDAY = "星期二";
68
69 /**
70 * 星期三;
71 */
72 public static final String WEDNESDAY = "星期三";
73
74 /**
75 * 星期四;
76 */
77 public static final String THURSDAY = "星期四";
78
79 /**
80 * 星期五;
81 */
82 public static final String FRIDAY = "星期五";
83
84 /**
85 * 星期六;
86 */
87 public static final String SATURDAY = "星期六";
88
89 /**
90 * 年
91 */
92 private static final String YEAR = "year";
93
94 /**
95 * 月
96 */
97 private static final String MONTH = "month";
98
99 /**
100 * 周
101 */
102 private static final String WEEK = "week";
103
104 /**
105 * 日
106 */
107 private static final String DAY = "day";
108
109 /**
110 * 时
111 */
112 private static final String HOUR = "hour";
113
114 /**
115 * 分
116 */
117 private static final String MINUTE = "minute";
118
119 /**
120 * 秒
121 */
122 private static final String SECOND = "second";
123
124 /**
125 * 获取当前日期和时间字符串.
126 *
127 * @return String 日期时间字符串,例如 2015-08-11 09:51:53
128 */
129 public static String getLocalDateTimeStr() {
130 return format(LocalDateTime.now(), DATETIME_PATTERN);
131 }
132
133 /**
134 * 获取当前日期字符串.
135 *
136 * @return String 日期字符串,例如2015-08-11
137 */
138 public static String getLocalDateStr() {
139 return format(LocalDate.now(), DATE_PATTERN);
140 }
141
142 /**
143 * 获取当前时间字符串.
144 *
145 * @return String 时间字符串,例如 09:51:53
146 */
147 public static String getLocalTimeStr() {
148 return format(LocalTime.now(), TIME_PATTERN);
149 }
150
151 /**
152 * 获取当前星期字符串.
153 *
154 * @return String 当前星期字符串,例如 星期二
155 */
156 public static String getDayOfWeekStr() {
157 return format(LocalDate.now(), "E");
158 }
159
160 /**
161 * 获取指定日期是星期几
162 *
163 * @param localDate 日期
164 * @return String 星期几
165 */
166 public static String getDayOfWeekStr(LocalDate localDate) {
167 String[] weekOfDays = {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
168 int dayOfWeek = localDate.getDayOfWeek().getValue() - 1;
169 return weekOfDays[dayOfWeek];
170 }
171
172 /**
173 * 获取日期时间字符串
174 *
175 * @param temporal 需要转化的日期时间
176 * @param pattern 时间格式
177 * @return String 日期时间字符串,例如 2015-08-11 09:51:53
178 */
179 public static String format(TemporalAccessor temporal, String pattern) {
180 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
181 return dateTimeFormatter.format(temporal);
182 }
183
184 /**
185 * 日期时间字符串转换为日期时间(java.time.LocalDateTime)
186 *
187 * @param localDateTimeStr 日期时间字符串
188 * @param pattern 日期时间格式 例如DATETIME_PATTERN
189 * @return LocalDateTime 日期时间
190 */
191 public static LocalDateTime parseLocalDateTime(String localDateTimeStr, String pattern) {
192 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
193 return LocalDateTime.parse(localDateTimeStr, dateTimeFormatter);
194 }
195
196 /**
197 * 日期字符串转换为日期(java.time.LocalDate)
198 *
199 * @param localDateStr 日期字符串
200 * @param pattern 日期格式 例如DATE_PATTERN
201 * @return LocalDate 日期
202 */
203 public static LocalDate parseLocalDate(String localDateStr, String pattern) {
204 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
205 return LocalDate.parse(localDateStr, dateTimeFormatter);
206 }
207
208 /**
209 * 获取指定日期时间加上指定数量日期时间单位之后的日期时间.
210 *
211 * @param localDateTime 日期时间
212 * @param num 数量
213 * @param chronoUnit 日期时间单位
214 * @return LocalDateTime 新的日期时间
215 */
216 public static LocalDateTime plus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
217 return localDateTime.plus(num, chronoUnit);
218 }
219
220 /**
221 * 获取指定日期时间减去指定数量日期时间单位之后的日期时间.
222 *
223 * @param localDateTime 日期时间
224 * @param num 数量
225 * @param chronoUnit 日期时间单位
226 * @return LocalDateTime 新的日期时间
227 */
228 public static LocalDateTime minus(LocalDateTime localDateTime, int num, ChronoUnit chronoUnit) {
229 return localDateTime.minus(num, chronoUnit);
230 }
231
232 /**
233 * 根据ChronoUnit计算两个日期时间之间相隔日期时间
234 *
235 * @param start 开始日期时间
236 * @param end 结束日期时间
237 * @param chronoUnit 日期时间单位
238 * @return long 相隔日期时间
239 */
240 public static long getChronoUnitBetween(LocalDateTime start, LocalDateTime end, ChronoUnit chronoUnit) {
241 return Math.abs(start.until(end, chronoUnit));
242 }
243
244 /**
245 * 根据ChronoUnit计算两个日期之间相隔年数或月数或天数
246 *
247 * @param start 开始日期
248 * @param end 结束日期
249 * @param chronoUnit 日期时间单位,(ChronoUnit.YEARS,ChronoUnit.MONTHS,ChronoUnit.WEEKS,ChronoUnit.DAYS)
250 * @return long 相隔年数或月数或天数
251 */
252 public static long getChronoUnitBetween(LocalDate start, LocalDate end, ChronoUnit chronoUnit) {
253 return Math.abs(start.until(end, chronoUnit));
254 }
255
256 /**
257 * 获取本年第一天的日期字符串
258 *
259 * @return String 格式:yyyy-MM-dd 00:00:00
260 */
261 public static String getFirstDayOfYearStr() {
262 return getFirstDayOfYearStr(LocalDateTime.now());
263 }
264
265 /**
266 * 获取本年最后一天的日期字符串
267 *
268 * @return String 格式:yyyy-MM-dd 23:59:59
269 */
270 public static String getLastDayOfYearStr() {
271 return getLastDayOfYearStr(LocalDateTime.now());
272 }
273
274 /**
275 * 获取指定日期当年第一天的日期字符串
276 *
277 * @param localDateTime 指定日期时间
278 * @return String 格式:yyyy-MM-dd 00:00:00
279 */
280 public static String getFirstDayOfYearStr(LocalDateTime localDateTime) {
281 return getFirstDayOfYearStr(localDateTime, DATETIME_PATTERN);
282 }
283
284 /**
285 * 获取指定日期当年最后一天的日期字符串
286 *
287 * @param localDateTime 指定日期时间
288 * @return String 格式:yyyy-MM-dd 23:59:59
289 */
290 public static String getLastDayOfYearStr(LocalDateTime localDateTime) {
291 return getLastDayOfYearStr(localDateTime, DATETIME_PATTERN);
292 }
293
294 /**
295 * 获取指定日期当年第一天的日期字符串,带日期格式化参数
296 *
297 * @param localDateTime 指定日期时间
298 * @param pattern 日期时间格式
299 * @return String 格式:yyyy-MM-dd 00:00:00
300 */
301 public static String getFirstDayOfYearStr(LocalDateTime localDateTime, String pattern) {
302 return format(localDateTime.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0), pattern);
303 }
304
305 /**
306 * 获取指定日期当年最后一天的日期字符串,带日期格式化参数
307 *
308 * @param localDateTime 指定日期时间
309 * @param pattern 日期时间格式
310 * @return String 格式:yyyy-MM-dd 23:59:59
311 */
312 public static String getLastDayOfYearStr(LocalDateTime localDateTime, String pattern) {
313 return format(localDateTime.with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59), pattern);
314 }
315
316 /**
317 * 获取本月第一天的日期字符串
318 *
319 * @return String 格式:yyyy-MM-dd 00:00:00
320 */
321 public static String getFirstDayOfMonthStr() {
322 return getFirstDayOfMonthStr(LocalDateTime.now());
323 }
324
325 /**
326 * 获取本月最后一天的日期字符串
327 *
328 * @return String 格式:yyyy-MM-dd 23:59:59
329 */
330 public static String getLastDayOfMonthStr() {
331 return getLastDayOfMonthStr(LocalDateTime.now());
332 }
333
334 /**
335 * 获取指定日期当月第一天的日期字符串
336 *
337 * @param localDateTime 指定日期时间
338 * @return String 格式:yyyy-MM-dd 23:59:59
339 */
340 public static String getFirstDayOfMonthStr(LocalDateTime localDateTime) {
341 return getFirstDayOfMonthStr(localDateTime, DATETIME_PATTERN);
342 }
343
344 /**
345 * 获取指定日期当月最后一天的日期字符串
346 *
347 * @param localDateTime 指定日期时间
348 * @return String 格式:yyyy-MM-dd 23:59:59
349 */
350 public static String getLastDayOfMonthStr(LocalDateTime localDateTime) {
351 return getLastDayOfMonthStr(localDateTime, DATETIME_PATTERN);
352 }
353
354 /**
355 * 获取指定日期当月第一天的日期字符串,带日期格式化参数
356 *
357 * @param localDateTime 指定日期时间
358 * @return String 格式:yyyy-MM-dd 00:00:00
359 */
360 public static String getFirstDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
361 return format(localDateTime.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0), pattern);
362 }
363
364 /**
365 * 获取指定日期当月最后一天的日期字符串,带日期格式化参数
366 *
367 * @param localDateTime 指定日期时间
368 * @param pattern 日期时间格式
369 * @return String 格式:yyyy-MM-dd 23:59:59
370 */
371 public static String getLastDayOfMonthStr(LocalDateTime localDateTime, String pattern) {
372 return format(localDateTime.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59), pattern);
373 }
374
375 /**
376 * 获取本周第一天的日期字符串
377 *
378 * @return String 格式:yyyy-MM-dd 00:00:00
379 */
380 public static String getFirstDayOfWeekStr() {
381 return getFirstDayOfWeekStr(LocalDateTime.now());
382 }
383
384 /**
385 * 获取本周最后一天的日期字符串
386 *
387 * @return String 格式:yyyy-MM-dd 23:59:59
388 */
389 public static String getLastDayOfWeekStr() {
390 return getLastDayOfWeekStr(LocalDateTime.now());
391 }
392
393 /**
394 * 获取指定日期当周第一天的日期字符串,这里第一天为周一
395 *
396 * @param localDateTime 指定日期时间
397 * @return String 格式:yyyy-MM-dd 00:00:00
398 */
399 public static String getFirstDayOfWeekStr(LocalDateTime localDateTime) {
400 return getFirstDayOfWeekStr(localDateTime, DATETIME_PATTERN);
401 }
402
403 /**
404 * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日
405 *
406 * @param localDateTime 指定日期时间
407 * @return String 格式:yyyy-MM-dd 23:59:59
408 */
409 public static String getLastDayOfWeekStr(LocalDateTime localDateTime) {
410 return getLastDayOfWeekStr(localDateTime, DATETIME_PATTERN);
411 }
412
413 /**
414 * 获取指定日期当周第一天的日期字符串,这里第一天为周一,带日期格式化参数
415 *
416 * @param localDateTime 指定日期时间
417 * @param pattern 日期时间格式
418 * @return String 格式:yyyy-MM-dd 00:00:00
419 */
420 public static String getFirstDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
421 return format(localDateTime.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0), pattern);
422 }
423
424 /**
425 * 获取指定日期当周最后一天的日期字符串,这里最后一天为周日,带日期格式化参数
426 *
427 * @param localDateTime 指定日期时间
428 * @param pattern 日期时间格式
429 * @return String 格式:yyyy-MM-dd 23:59:59
430 */
431 public static String getLastDayOfWeekStr(LocalDateTime localDateTime, String pattern) {
432 return format(localDateTime.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59), pattern);
433 }
434
435 /**
436 * 获取今天开始时间的日期字符串
437 *
438 * @return String 格式:yyyy-MM-dd 00:00:00
439 */
440 public static String getStartTimeOfDayStr() {
441 return getStartTimeOfDayStr(LocalDateTime.now());
442 }
443
444 /**
445 * 获取今天结束时间的日期字符串
446 *
447 * @return String 格式:yyyy-MM-dd 23:59:59
448 */
449 public static String getEndTimeOfDayStr() {
450 return getEndTimeOfDayStr(LocalDateTime.now());
451 }
452
453 /**
454 * 获取指定日期开始时间的日期字符串
455 *
456 * @param localDateTime 指定日期时间
457 * @return String 格式:yyyy-MM-dd 00:00:00
458 */
459 public static String getStartTimeOfDayStr(LocalDateTime localDateTime) {
460 return getStartTimeOfDayStr(localDateTime, DATETIME_PATTERN);
461 }
462
463 /**
464 * 获取指定日期结束时间的日期字符串
465 *
466 * @param localDateTime 指定日期时间
467 * @return String 格式:yyyy-MM-dd 23:59:59
468 */
469 public static String getEndTimeOfDayStr(LocalDateTime localDateTime) {
470 return getEndTimeOfDayStr(localDateTime, DATETIME_PATTERN);
471 }
472
473 /**
474 * 获取指定日期开始时间的日期字符串,带日期格式化参数
475 *
476 * @param localDateTime 指定日期时间
477 * @param pattern 日期时间格式
478 * @return String 格式:yyyy-MM-dd HH:mm:ss
479 */
480 public static String getStartTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
481 return format(localDateTime.withHour(0).withMinute(0).withSecond(0), pattern);
482 }
483
484 /**
485 * 获取指定日期结束时间的日期字符串,带日期格式化参数
486 *
487 * @param localDateTime 指定日期时间
488 * @param pattern 日期时间格式
489 * @return String 格式:yyyy-MM-dd 23:59:59
490 */
491 public static String getEndTimeOfDayStr(LocalDateTime localDateTime, String pattern) {
492 return format(localDateTime.withHour(23).withMinute(59).withSecond(59), pattern);
493 }
494
495 /**
496 * 切割日期。按照周期切割成小段日期段。例如: <br>
497 *
498 * @param startDate 开始日期(yyyy-MM-dd)
499 * @param endDate 结束日期(yyyy-MM-dd)
500 * @param period 周期(天,周,月,年)
501 * @return 切割之后的日期集合
502 * <li>startDate="2019-02-28",endDate="2019-03-05",period="day"</li>
503 * <li>结果为:[2019-02-28, 2019-03-01, 2019-03-02, 2019-03-03, 2019-03-04, 2019-03-05]</li><br>
504 * <li>startDate="2019-02-28",endDate="2019-03-25",period="week"</li>
505 * <li>结果为:[2019-02-28,2019-03-06, 2019-03-07,2019-03-13, 2019-03-14,2019-03-20,
506 * 2019-03-21,2019-03-25]</li><br>
507 * <li>startDate="2019-02-28",endDate="2019-05-25",period="month"</li>
508 * <li>结果为:[2019-02-28,2019-02-28, 2019-03-01,2019-03-31, 2019-04-01,2019-04-30,
509 * 2019-05-01,2019-05-25]</li><br>
510 * <li>startDate="2019-02-28",endDate="2020-05-25",period="year"</li>
511 * <li>结果为:[2019-02-28,2019-12-31, 2020-01-01,2020-05-25]</li><br>
512 */
513 public static List<String> listDateStrs(String startDate, String endDate, String period) {
514 List<String> result = new ArrayList<>();
515 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN);
516 LocalDate end = LocalDate.parse(endDate, dateTimeFormatter);
517 LocalDate start = LocalDate.parse(startDate, dateTimeFormatter);
518 LocalDate tmp = start;
519 switch (period) {
520 case DAY:
521 while (start.isBefore(end) || start.isEqual(end)) {
522 result.add(start.toString());
523 start = start.plusDays(1);
524 }
525 break;
526 case WEEK:
527 while (tmp.isBefore(end) || tmp.isEqual(end)) {
528 if (tmp.plusDays(6).isAfter(end)) {
529 result.add(tmp.toString() + "," + end);
530 } else {
531 result.add(tmp.toString() + "," + tmp.plusDays(6));
532 }
533 tmp = tmp.plusDays(7);
534 }
535 break;
536 case MONTH:
537 while (tmp.isBefore(end) || tmp.isEqual(end)) {
538 LocalDate lastDayOfMonth = tmp.with(TemporalAdjusters.lastDayOfMonth());
539 if (lastDayOfMonth.isAfter(end)) {
540 result.add(tmp.toString() + "," + end);
541 } else {
542 result.add(tmp.toString() + "," + lastDayOfMonth);
543 }
544 tmp = lastDayOfMonth.plusDays(1);
545 }
546 break;
547 case YEAR:
548 while (tmp.isBefore(end) || tmp.isEqual(end)) {
549 LocalDate lastDayOfYear = tmp.with(TemporalAdjusters.lastDayOfYear());
550 if (lastDayOfYear.isAfter(end)) {
551 result.add(tmp.toString() + "," + end);
552 } else {
553 result.add(tmp.toString() + "," + lastDayOfYear);
554 }
555 tmp = lastDayOfYear.plusDays(1);
556 }
557 break;
558 default:
559 break;
560 }
561 return result;
562 }
563
564 public static void main(String[] args) {
565 System.out.println(getLocalDateTimeStr());
566 System.out.println(getLocalDateStr());
567 System.out.println(getLocalTimeStr());
568 System.out.println(getDayOfWeekStr());
569 System.out.println(getDayOfWeekStr(LocalDate.now()));
570
571 System.out.println("========");
572 System.out.println(format(LocalDate.now(), UNSIGNED_DATE_PATTERN));
573
574 System.out.println("========");
575 System.out.println(parseLocalDateTime("2020-12-13 11:14:12", DATETIME_PATTERN));
576 System.out.println(parseLocalDate("2020-12-13", DATE_PATTERN));
577
578 System.out.println("========");
579 System.out.println(plus(LocalDateTime.now(), 3, ChronoUnit.HOURS));
580 System.out.println(minus(LocalDateTime.now(), 4, ChronoUnit.DAYS));
581
582 System.out.println("========");
583 System.out.println(getChronoUnitBetween(LocalDateTime.now(), parseLocalDateTime("2020-12-12 12:03:12", DATETIME_PATTERN), ChronoUnit.MINUTES));
584 System.out.println(getChronoUnitBetween(LocalDate.now(), parseLocalDate("2021-12-12", DATE_PATTERN), ChronoUnit.WEEKS));
585
586 System.out.println("========");
587 System.out.println(getFirstDayOfYearStr());
588 System.out.println(getFirstDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
589 System.out.println(getFirstDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
590
591 System.out.println(getLastDayOfYearStr());
592 System.out.println(getLastDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
593 System.out.println(getLastDayOfYearStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
594
595 System.out.println("========");
596 System.out.println(getFirstDayOfMonthStr());
597 System.out.println(getFirstDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
598 System.out.println(getFirstDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
599
600 System.out.println(getLastDayOfMonthStr());
601 System.out.println(getLastDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
602 System.out.println(getLastDayOfMonthStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
603
604 System.out.println("========");
605 System.out.println(getFirstDayOfWeekStr());
606 System.out.println(getFirstDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
607 System.out.println(getFirstDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
608
609 System.out.println(getLastDayOfWeekStr());
610 System.out.println(getLastDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
611 System.out.println(getLastDayOfWeekStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
612
613 System.out.println("========");
614 System.out.println(getStartTimeOfDayStr());
615 System.out.println(getStartTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
616 System.out.println(getStartTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
617
618 System.out.println(getEndTimeOfDayStr());
619 System.out.println(getEndTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN)));
620 System.out.println(getEndTimeOfDayStr(parseLocalDateTime("2021-12-12 12:03:12", DATETIME_PATTERN), UNSIGNED_DATETIME_PATTERN));
621
622 System.out.println("========");
623 List<String> dateStrs = listDateStrs("2019-01-30", "2020-12-13", YEAR);
624 for (String dateStr : dateStrs) {
625 System.out.println(dateStr);
626 }
627
628 System.out.println("========");
629 List<String> dateStrs1 = listDateStrs("2019-01-30", "2020-12-13", MONTH);
630 for (String dateStr : dateStrs1) {
631 System.out.println(dateStr);
632 }
633
634 System.out.println("========");
635 List<String> dateStrs2 = listDateStrs("2020-12-01", "2020-12-13", DAY);
636 for (String dateStr : dateStrs2) {
637 System.out.println(dateStr);
638 }
639 }
640
641 }
参考链接:http://c.biancheng.net/view/876.html
https://blog.csdn.net/ThinkWon/article/details/111116600
https://blog.csdn.net/java_mdzy/article/details/100099922

浙公网安备 33010602011771号