如何在Java中比较日期间的大小?
示例:
date1
是22-02-2010
date2
是今天07-04-2010
date3
是25-12-2010
其中date3
始终大于date1
和date2
始终为今天。如何验证今天的日期是否在date1
和date3
之间?
如何在Java中比较日期间的大小?
示例:
date1
是22-02-2010
date2
是今天07-04-2010
date3
是25-12-2010
其中date3
始终大于date1
和date2
始终为今天。如何验证今天的日期是否在date1
和date3
之间?
Date 类有 before 和 after 方法,可以通过 比较 方法进行比较:
if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
// In between
}
对于包含比较:
if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
/* historyDate <= todayDate <= futureDate */
}
您也可以尝试使用Joda-Time,但请注意以下几点:
Java 6和7以及Android都可用后移植版。Joda-Time是Java SE 8之前的事实标准日期和时间库。现在要求用户迁移到java.time(JSR-310)。
date1.compareTo(date2);
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");
}
方法二: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");
}
方法三: Calendar.before()
、Calendar.after()
和 Calendar.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");
}
java.util.Date
、java.util.Calendar
和java.text.SimpleDateFormat
这样的老旧日期时间类现在已经成为遗留系统,被内置于Java 8和Java 9中的java.time类所取代。请参阅Oracle的教程。 - Basil BourqueLocalDate 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 ) ;
或者更好的方法是将ThreeTen-Extra库添加到您的项目中。
LocalDateRange.of(
LocalDate.of( … ) ,
LocalDate.of( … )
).contains(
LocalDate.now()
)
半开区间方法,起始点包含,而结束点不包含。
顺便说一句,那是一个文本表示日期或日期时间值的不好的格式选择。尽可能地,坚持使用标准ISO 8601格式。ISO 8601格式是明确无歧义、跨越人类文化理解范围、易于机器解析的。
对于仅包含日期的值,标准格式为YYYY-MM-DD。请注意,这种格式在按字母顺序排序时具有年代顺序。
LocalDate
LocalDate
类表示仅包含日期、不包含时间和时区的值。
时区对于确定日期非常重要。对于任何给定的时刻,由于时区不同,世界各地的日期都会有所不同。例如,在法国巴黎的午夜过后几分钟就是新的一天,而在加拿大魁北克省蒙特利尔仍然是“昨天”。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
由于您的输入字符串不是标准格式,我们必须定义一个格式化模式来匹配。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );
LocalDate start = LocalDate.parse( "22-02-2010" , f );
LocalDate stop = LocalDate.parse( "25-12-2010" , f );
Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;
请查看gstackoverflow的回答,其中列出了您可以调用的比较方法列表。
java.time 框架是内置于 Java 8 及更高版本中的。这些类替代了老旧且麻烦的 legacy 日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
想要了解更多,请参阅Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范是JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,无需java.sql.*
类。Hibernate 5和JPA 2.2支持java.time。
在哪里获取java.time类?
Interval
, YearWeek
, YearQuarter
,以及more。
更新:下面的“Joda-Time”部分保持不变,作为历史记录。现在处于维护模式的Joda-Time项目建议迁移到java.time类。
其他答案对于捆绑的java.util.Date和java.util.Calendar类是正确的。但是这些类通常会出现问题。因此,以下是使用Joda-Time 2.3库的示例代码。
如果您真正想要一个没有时间部分和时区的日期,那么请使用Joda-Time中的LocalDate
类。该类提供了比较方法,包括compareTo
(与Java Comparators一起使用)、isBefore
、isAfter
和isEqual
。String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
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 ) ) );
如果你需要处理时间段,我建议使用Joda-Time中的Duration、Interval和Period类。这些类提供了诸如overlap
和contains
等方法,使比较变得容易。
对于文本表示,可以查看ISO 8601标准的:
Joda-Time类可以处理这两种格式的字符串,既可以作为输入(解析),也可以作为输出(生成字符串)。
Joda-Time使用半开区间方法进行比较,其中时间段的开始部分是包含的,而结束部分是不包含的。这种方法对于处理时间段非常明智。请在StackOverflow上搜索更多信息。
比较这两个日期:
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");
Date
中的月份组件是从零开始索引的。 - LiiisAfter()
方法isBefore()
方法isEqual()
方法compareTo()
方法这些方法存在于LocalDate
、LocalTime
和LocalDateTime
类中。
这些类在Java 8及以上版本内置。大部分java.time功能已被迁移到Java 6和7中的ThreeTen-Backport,并在Android中进行了进一步的适配,使用方法请参考ThreeTenABP(详见如何使用...)。
Date.getTime()
方法,它会返回一个表示该日期距离格林威治标准时间1970年1月1日午夜零点的毫秒数。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 <
*/
试试这个
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;
}
}
这段代码根据韩国地区设置,确定今天是否在某个时间段内。
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
}
java.util.Date
的老旧日期时间类现已成为遗留系统,被 Java 8 和 Java 9 内置的 java.time 类所取代。请参阅 Oracle 的教程。 - Basil Bourquejava.time
适用于 Java 8 的注释,这是现在的标准版本(与我写这个答案的时候相反)。当然,随时欢迎编辑此答案并添加更多最新的示例代码! ;) (编辑:啊,我看到你自己已经提供了带有这些示例的答案) - Bart Kiers