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