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

posted @ 2023-04-05 16:42  欢乐豆123  阅读(1337)  评论(0编辑  收藏  举报