如何在Java中比较date?
如何比较Java中的date?
例:
date1是22-02-2010
date2今天是07-04-2010
date3是25-12-2010
date3
总是大于date1
, date2
总是在今天。 如何确认今天的date是在date1和date3之间?
date有方法之前和之后 ,可以相互比较如下:
if(todayDate.after(historyDate) && todayDate.before(futureDate)) { // In between }
包含比较:
if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) { /* historyDate <= todayDate <= futureDate */ }
你也可以给Joda-Time一个去,但是请注意:
Joda-Time是Java SE 8之前Java 事实上的标准date和时间库。现在要求用户迁移到java.time ( JSR-310 )。
后端端口可用于Java 6和7以及Android。
使用compareTo :
date1.compareTo(date2);
以下是比较date的最常用方法。 但我更喜欢第一个
方法1:使用Date.before(),Date.after()和Date.equals()
if(date1.after(date2)){ System.out.println("Date1 is after Date2"); } if(date1.before(date2)){ System.out.println("Date1 is before Date2"); } if(date1.equals(date2)){ System.out.println("Date1 is equal Date2"); }
方法-2:Date.compareTo()
if(date1.compareTo(date2)>0){ System.out.println("Date1 is after Date2"); }else if(date1.compareTo(date2)<0){ System.out.println("Date1 is before Date2"); }else{ System.out.println("Date1 is equal to Date2"); }
方法3:Calender.before(),Calender.after()和Calender.equals()
Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTime(date1); cal2.setTime(date2); if(cal1.after(cal2)){ System.out.println("Date1 is after Date2"); } if(cal1.before(cal2)){ System.out.println("Date1 is before Date2"); } if(cal1.equals(cal2)){ System.out.println("Date1 is equal Date2"); }
比较两个date:
Date today = new Date(); Date myDate = new Date(today.getYear(),today.getMonth()-1,today.getDay()); System.out.println("My Date is"+myDate); System.out.println("Today Date is"+today); if (today.compareTo(myDate)<0) System.out.println("Today Date is Lesser than my Date"); else if (today.compareTo(myDate)>0) System.out.println("Today Date is Greater than my date"); else System.out.println("Both Dates are equal");
TL;博士
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ; Boolean isBetween = ( ! today.isBefore( localDate1 ) ) // “not-before” is short for “is-equal-to or later-than”. && today.isBefore( localDate3 ) ;
半开放的方式,开始包容,而结束是排他性的 。
格式不好的select
顺便说一下,对于date或date时间值的文本表示来说,这是一个糟糕的select。 只要有可能,坚持使用标准的ISO 8601格式。 ISO 8601格式是明确的,跨人类文化可以理解的,并且易于被机器parsing。
对于仅限date的值,标准格式为YYYY-MM-DD。 请注意,如果按字母顺序sorting,则此格式具有按时间顺序排列的好处。
LocalDate
LocalDate
类代表没有时间和没有时区的只有date的值。
时区对确定date至关重要。 对于任何特定的时刻,date在全球各地按照地区而不同。 例如, 巴黎午夜过后的几分钟, 法国是一个新的一天,而在魁北克蒙特利尔仍然是“昨天”。
ZoneId z = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( z );
DateTimeFormatter
由于您的inputstring是非标准格式,我们必须定义一个格式模式来匹配。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );
用它来parsinginput的string。
LocalDate start = LocalDate.parse( "22-02-2010" , f ); LocalDate stop = LocalDate.parse( "25-12-2010" , f );
在date时间的工作中,通常最好是通过半开式方法定义一个时间跨度,其中开始是包含性的,而结尾是排他性的 。 所以我们想要知道今天是否等于或晚于开始和停止之前。 一个简短的说法是“不等于开始”。
Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;
查看gstackoverflow的回答,显示可以调用的比较方法的列表。
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。
从何处获取java.time类?
- Java SE 8和SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和SE 7
- 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
- Android的
- ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
- 请参阅如何使用ThreeTenABP …。
ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等 。
更新:下面这个“乔达时间”部分作为历史保持不变。 Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。
乔达时间
其他答案对于捆绑的java.util.Date和java.util.Calendar类是正确的。 但是这些class级出了名的麻烦。 所以这里有一些使用Joda-Time 2.3库的例子代码。
如果你真的想要一个没有任何时间部分和时区的date,那么使用Joda-Time中的LocalDate
类。 该类提供了比较方法,包括compareTo
(用于Java比较器 ), isBefore
, isAfter
和isEqual
。
input…
String string1 = "22-02-2010"; String string2 = "07-04-2010"; String string3 = "25-12-2010";
定义描述inputstring的格式化程序…
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
使用格式化程序将stringparsing为LocalDate对象…
LocalDate localDate1 = formatter.parseLocalDate( string1 ); LocalDate localDate2 = formatter.parseLocalDate( string2 ); LocalDate localDate3 = formatter.parseLocalDate( string3 ); boolean is1After2 = localDate1.isAfter( localDate2 ); boolean is2Before3 = localDate2.isBefore( localDate3 );
转储到控制台…
System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 ); System.out.println( "is1After2 " + is1After2 ); System.out.println( "is2Before3 " + is2Before3 );
当运行…
Dates: 2010-02-22 2010-04-07 2010-12-25 is1After2 false is2Before3 true
所以看看第二个是否在另外两个之间(完全,意思是不等于任何一个端点)…
boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );
与时间跨度一起使用
如果你的工作时间跨度多,我build议在Joda-Time中探索课程: 时间 , 时间间隔和时间 。 方法如overlap
和contains
比较容易。
对于文本表示,请看ISO 8601标准:
- 持续时间
格式:PnYnMnDTnHnMnS
例如:P3Y6M4DT12H30M5S
(意思是“三年六个月四天十二小时三十分五秒”) - 间隔
格式:开始/结束
例如:2007-03-01T13:00:00Z / 2008-05-11T15:30:00Z
Joda-Time类可以使用这两种格式的string,分别作为input(parsing)和输出(生成string)。
Joda-Time使用Half-Open方法执行比较,其中跨度的开始是包含性的,而结尾是排他性的 。 这种方法是处理时间跨度的明智之举。 searchStackOverflow了解更多信息。
更新Java 8及更高版本
-
isAfter()
-
isBefore()
-
isEqual()
-
compareTo()
这些方法存在于LocalDate
, LocalTime
和LocalDateTime
类中。
这些类是内置于Java 8及更高版本的。 大部分的java.timefunction在ThreeTen-Backport中移植到Java 6&7中,并进一步适用于ThreeTenABP中的 Android (请参阅如何使用… )。
你可以使用Date.getTime()
:
返回自此date对象所表示的1970年1月1日00:00:00 GMT以来的毫秒数。
这意味着你可以像数字一样对它们进行比较:
if (date1.getTime() <= date.getTime() && date.getTime() <= date2.getTime()) { /* * date is between date1 and date2 (both inclusive) */ } /* * when date1 = 2015-01-01 and date2 = 2015-01-10 then * returns true for: * 2015-01-01 * 2015-01-01 00:00:01 * 2015-01-02 * 2015-01-10 * returns false for: * 2014-12-31 23:59:59 * 2015-01-10 00:00:01 * * if one or both dates are exclusive then change <= to < */
使用getTime()获取date的数值,然后使用返回的值进行比较。
尝试这个
public static boolean compareDates(String psDate1, String psDate2) throws ParseException{ SimpleDateFormat dateFormat = new SimpleDateFormat ("dd/MM/yyyy"); Date date1 = dateFormat.parse(psDate1); Date date2 = dateFormat.parse(psDate2); if(date2.after(date1)) { return true; } else { return false; } }
这个代码今天确定是在一段时间..基于KOREA语言环境
Calendar cstart = Calendar.getInstance(Locale.KOREA); cstart.clear(); cstart.set(startyear, startmonth, startday); Calendar cend = Calendar.getInstance(Locale.KOREA); cend.clear(); cend.set(endyear, endmonth, endday); Calendar c = Calendar.getInstance(Locale.KOREA); if(c.after(cstart) && c.before(cend)) { // today is in startyear/startmonth/startday ~ endyear/endmonth/endday }
这个方法对我有用:
public static String daysBetween(String day1, String day2) { String daysBetween = ""; SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date1 = myFormat.parse(day1); Date date2 = myFormat.parse(day2); long diff = date2.getTime() - date1.getTime(); daysBetween = ""+(TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS)); } catch (ParseException e) { e.printStackTrace(); } return daysBetween; }