如何在Java中比较date?

如何比较Java中的date?

例:

date1是22-02-2010
date2今天是07-04-2010
date3是25-12-2010

date3总是大于date1date2总是在今天。 如何确认今天的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.DateCalendarSimpleDateFormat

Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。


更新:下面这个“乔达时间”部分作为历史保持不变。 Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。

乔达时间

其他答案对于捆绑的java.util.Date和java.util.Calendar类是正确的。 但是这些class级出了名的麻烦。 所以这里有一些使用Joda-Time 2.3库的例子代码。

如果你真的想要一个没有任何时间部分和时区的date,那么使用Joda-Time中的LocalDate类。 该类提供了比较方法,包括compareTo (用于Java比较器 ), isBeforeisAfterisEqual

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中探索课程: 时间 , 时间间隔和时间 。 方法如overlapcontains比较容易。

对于文本表示,请看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()

这些方法存在于LocalDateLocalTimeLocalDateTime类中。

这些类是内置于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; }