java中如何灵活的比较日期大小

java中如何灵活的比较日期时间大小
在比较两个日期时间的大小之前,我们先了解两个需要用到的类:Date和Calendar
1. Date类
java.util 包提供了 Date 类来封装当前的日期和时间
1 public static void main(String[] args) {
2 Date dNow = new Date();
3 System.out.println("当前时间戳为:" + dNow.getTime());
4 SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
5 System.out.println("当前时间格式化为:" + ft.format(dNow));
6 }
7
8 // 测试结果为:
9 // 当前时间戳为:1680682212062 (毫秒时间戳)
10 // 当前时间格式化为:2023-04-05 04:10:12
2. Calendar类
Calendar允许我们设置和获取日期数据的特定部分
1 public static void main(String[] args) throws ParseException {
2
3 // Calendar类的功能要比Date类强大很多
4
5 Calendar c = Calendar.getInstance(); // 默认是当前日期
6
7 // 把Calendar对象c1的年月日分别设这为:2009、6、12
8 c.set(2009, 6, 12);
9
10 // 10天后的日期
11 c.set(Calendar.DATE, 10);
12 c.set(Calendar.YEAR, 2005);
13
14 // 10天前的日期
15 c.set(Calendar.DATE, -10);
16
17 }
3. 日期和string的互转方法
1) Date转String Date d=new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String ds=df.format(d);
2)String转Date String ds=new String("2023-04-05 08:30:00"); Date sd=ds.parse(ds);
4. 比较给定时间是否在日期区间内
实现方式一:
利用Date的特性以及其before和after方法
1 package henry.date;
2
3 import java.text.ParseException;
4 import java.text.SimpleDateFormat;
5 import java.util.Date;
6
7 public class DateDemo2 {
8 public static void main(String[] args) throws ParseException {
9 Date date = new Date();
10 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
11 String dNow = df.format(date);
12 System.out.println("当前年月日时间格式化为:" + dNow);
13 System.out.println("当前时间戳为:" + date.getTime());
14
15 // 检查时间是否在特定时段:晚上19:30-凌晨4:29
16 SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
17 String dNowComplete = df2.format(date);
18 System.out.println("当前完整时间格式化为:" + dNowComplete);
19
20 String c1 = dNow + " 19:30:00";
21 System.out.println("c1>>>" + c1);
22 Date c1Date = df2.parse(c1);
23 System.out.println("c1时间戳:" + c1Date.getTime());
24
25 String c2 = dNow + " 23:59:59";
26 System.out.println("c2>>>" + c2);
27 Date c2Date = df2.parse(c2);
28 System.out.println("c1时间戳:" + c2Date.getTime());
29
30 String c3 = dNow + " 00:00:00";
31 System.out.println("c3>>>" + c3);
32 Date c3Date = df2.parse(c3);
33 System.out.println("c1时间戳:" + c3Date.getTime());
34
35 String c4 = dNow + " 04:29:00";
36 System.out.println("c4>>>" + c4);
37 Date c4Date = df2.parse(c4);
38 System.out.println("c4时间戳:" + c4Date.getTime());
39
40 if (date.after(c1Date) && date.before(c2Date)) {
41 System.out.println("当前时间在指定时间范围内:19:30:00-23:59:59");
42 } else if (date.after(c3Date) && date.before(c4Date)) {
43 System.out.println("当前时间在指定时间范围内:00:00:00-04:29:00");
44 } else {
45 System.out.println("当前时间不在指定时间范围内:" + dNowComplete);
46 }
47 }
48 }
49
50 // 测试结果
51 // 当前年月日时间格式化为:2023-04-06
52 // 当前时间戳为:1680744023395
53 // 当前完整时间格式化为:2023-04-06 09:20:23
54 // c1>>>2023-04-06 19:30:00
55 // c1时间戳:1680780600000
56 // c2>>>2023-04-06 23:59:59
57 // c1时间戳:1680796799000
58 // c3>>>2023-04-06 00:00:00
59 // c1时间戳:1680710400000
60 // c4>>>2023-04-06 04:29:00
61 // c4时间戳:1680726540000
62 // 当前时间不在指定时间范围内:2023-04-06 09:20:23
实现方式二:利用Calendar的before和after两个方法
1 package henry.date;
2
3 import java.text.ParseException;
4 import java.text.SimpleDateFormat;
5 import java.util.Calendar;
6 import java.util.Date;
7
8 public class DateDemo {
9 public static void main(String[] args) throws ParseException {
10 DateDemo dateDemo = new DateDemo();
11 String addTime = new String("2023-04-05 05:00:00");
12 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
13
14 / string转化为date类
15 Date sd1 = df.parse(addTime);
16 Calendar checkTime = Calendar.getInstance();
17 checkTime.setTime(sd1);
18 int hour=checkTime.get(Calendar.HOUR_OF_DAY);
19 System.out.println("hour:"+hour);
20
21 boolean res = dateDemo.checkExistTimeRange(checkTime);
22 String str = res ? "是" : "否";
23 System.out.println("检查发布时间是否在特定时段:" + str);
24
25 }
26
27
28 // 检查给定时间是否在特定时段:晚上19:30-凌晨4:29
29 public Boolean checkExistTimeRange(Calendar checkTime) {
30
31 // 19:30:00
32 Calendar c1 = Calendar.getInstance();
33 c1.set(Calendar.HOUR_OF_DAY, 19);
34 c1.set(Calendar.MINUTE, 30);
35 c1.set(Calendar.SECOND, 0);
36
37 // 23:59:59
38 Calendar c2 = Calendar.getInstance();
39 c2.set(Calendar.HOUR_OF_DAY, 23);
40 c2.set(Calendar.MINUTE, 59);
41 c2.set(Calendar.SECOND, 59);
42
43 // 00:00:00
44 Calendar c3 = Calendar.getInstance();
45 c3.set(Calendar.HOUR_OF_DAY, 0);
46 c3.set(Calendar.MINUTE, 0);
47 c3.set(Calendar.SECOND, 0);
48
49 // 04:29:00
50 Calendar c4 = Calendar.getInstance();
51 c4.set(Calendar.HOUR_OF_DAY, 4);
52 c4.set(Calendar.MINUTE, 29);
53 c4.set(Calendar.SECOND, 0);
54
55
56 if (checkTime.after(c1) && checkTime.before(c2)) {
57 return true;
58 }
59
60 if (checkTime.after(c3) && checkTime.before(c4)) {
61 return true;
62 }
63
64 return false;
65 }
66 }
67
68 // 测试结果为:
69 // 检查发布时间是否在特定时段:否
5. SimpleDateFormat 非线程安全
SimpleDateFormat源码的注解中明确指出在进行日期转换的时候是不同步的,也就会出现线程安全问题,因此建议为每个线程都创建一个SimpleDateFormat对象,如果在多线程环境中要使用一个SimpleDateFormat对象,就必须保证其同步。
因此,在使用SimpleDateFormat的时候,需要特别注意,最好是使用FastDateFormat,或者DateFormatUtils进行替代,或者使用Joda-Time替代。防止在多线程环境中出现线程安全问题,具体非线程安全问题,后面再继续研究源码。
6. FastDateFormat
线程安全的,可以直接使用,不必考虑多线程的情况
1 FastDateFormat format = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
2 System.out.println(format.format(new Date()));
3
4 // 可以使用DateFormatUtils类来操作,方法里面也是使用的FastDateFormat类来做的
5 System.out.println(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
7. Joda-Time 线程安全
Joda-Time与以上两种有所区别,不仅仅可以对时间进行格式化输出,而且可以生成瞬时时间值,并与Calendar、Date等对象相互转化,极大的方便了程序的兼容性。由于Joda-Time很优秀,在Java 8出现前的很长时间内成为Java中日期时间处理的标准,用来弥补JDK的不足。
限于篇幅,后面再用一篇文章单独介绍Joda-Time。
参考链接:
https://www.cnblogs.com/wupeixuan/p/11695256.html
https://www.cnblogs.com/hongmoshui/p/10432297.html