关于Java日期类,日历类以及时间工具类

Date 类

Date 类表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。

1. 构造方法

Date 类有如下两个构造方法。

  • Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。
  • Date(long date):此种形式表示从 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0 秒开始经过参数 date 指定的毫秒数。


这两个构造方法的使用示例如下:

  1. Date date1 = new Date(); // 调用无参数构造函数
  2. System.out.println(date1.toString()); // 输出:Wed May 18 21:24:40 CST 2016
  3. Date date2 = new Date(60000); // 调用含有一个long类型参数的构造函数
  4. 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 所示。

表1 Date类中的常用方法
方法描述
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 所示。

表 2 Calendar类的常用方法
方法描述
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

posted @ 2022-08-29 14:02  无火祭祀场  阅读(298)  评论(0)    收藏  举报