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

🏰 365bet现场走地盘 📅 2025-07-06 09:01:59 👤 admin 👁️ 5327 👑 938
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

皇家推荐

详细指南:如何正确使用扫描仪进行文档扫描
365bet现场走地盘

详细指南:如何正确使用扫描仪进行文档扫描

📅 07-02 👁️ 3687
蓝光电影什么意思 蓝光电影什么时候开始的
365商城怎么下载

蓝光电影什么意思 蓝光电影什么时候开始的

📅 06-28 👁️ 9674
DNF: 被时代掩埋的四大无影剑, 遥远又清晰
日博best365

DNF: 被时代掩埋的四大无影剑, 遥远又清晰

📅 07-01 👁️ 7621
手幅设计介绍
365bet现场走地盘

手幅设计介绍

📅 07-04 👁️ 5964
10款好用B5精華推薦/評價/比較!B5精華功效+適合哪種肌膚?
下载适用于 Surface 的驱动程序和固件
日博best365

下载适用于 Surface 的驱动程序和固件

📅 06-27 👁️ 194