比较Java中的日期
最后修改:2020年4月19日
1.介绍
在本教程中,我们将专注于如何使用该教程进行比较日期Java 8日期/时间API。我们将深入研究检查两个日期是否相等以及如何比较日期的不同方法。
2.比较日期
在Java中表达日期的基本方法是localDate.。让我们考虑两个localDate.对象实例,代表2019年8月10日和2019年7月1日:
localdate firstdate = localdate.of(2019,8,10);localdate seconddate = localdate.of(2019,7,1);
我们将比较两个localDate.通过利用的物体isafter()那isbefore(), 和isequal()方法,以及等于()和相比于()。
我们使用isafter()方法来检查日期实例是否在其他指定日期之后。因此,下一个JUnit断言将通过:
Assertthat(首次申请。(仲裁员)是(真实));
类似地,该方法isbefore()检查日期实例是否在其他指定日期之前:
asserthat(firstdate.isBefore(刚达到)是(false));
该方法是平等的()检查一个日期在本地时间轴上是否代表与其他指定日期相同的点:
assertthat(首字母),是(真实));assertthat(首字母),是(假));
2.1。使用该日期使用可比界面
这等于()方法将给出与是平等的(),但只有在传递的参数是相同的类型(在这种情况下,localDate.):
Assertthat(首次换算(仲裁牌),是(false));
这是平等的()方法可用于与不同类型的对象进行比较,例如JAPANESEDATE.那ThaiBuddhistDate, 等等。
类来比较两个日期实例相比于()方法定义的可比界面:
为了(firstDate.compareTo (secondDate), (1));为了(secondDate.compareTo (firstDate), (1));
3.比较包含时间组件的日期实例
本节将解释如何比较两者LocalDateTime实例。LocalDateTime实例包含日期和时间组件。
同样到localDate.,我们比较了两个LocalDateTime与方法的实例isafter()那isbefore()和是平等的()。此外,等于()和相比于()可以用类似的方式描述LocalDate。
同样,我们可以使用相同的方法来比较两个ZonedDatetime.实例。让我们比较一下同一天纽约当地时间8点和柏林当地时间14点的情况:
zoneddatetime timeinnewyork = zoneddatetime.of(2019,8,10,8,0,0,0,0,zoneid.of(“America / new_york”));ZonedDatetime TimeInberlin = ZonedDatetime.of(2019,8,10,14,0,0,0,0,zoneid.of(“欧洲/柏林”);assertthat(timeinnewyork.isafter(timeinberlin),是(false));assertthat(timeinnewyork.isbefore(timeinberlin),是(false));assertthat(timeinnewyork.isequal(timeinberlin),是(true));
虽然两ZonedDatetime.实例代表同一时刻,它们不代表相等的Java对象。他们有不同的LocalDateTime和ZoneId在内部领域:
assertthat(timeinnewyork.equals(timeinberlin),是(false));assertthat(timeinnewyork.compareto(timeinberlin),是(-1));
4.额外的比较
让我们创建一个简单的实用程序类,以获得更复杂的比较。
首先,我们将检查实例是否LocalDateTime和localDate.都在同一天:
public static boolean isameday (LocalDateTime timestamp, LocalDate localDateToCompare) {return timestamp. tolocaldate ().isEqual(localDateToCompare);}
其次,我们将检查是否有两个实例LocalDateTime都在同一天:
公共静态Boolean isSameday(localDateTime时间戳,localDateTeTime TimestAmptocompare){return时间戳.truncatedto(天).isequal(timestamptocompart.truncatedto(天));}
这TruncateTo(TemporalUnit)方法截断给定级别的日期,在我们的例子中是一天。
第三,我们可以在一小时的水平下实现比较:
public static boolean isamehour (LocalDateTime时间戳,LocalDateTime时间戳){return timestamp. truncatedto (HOURS) .isEqual(timestampToCompare. truncatedto (HOURS));}
最后,以类似的方式,我们可以检查两个ZonedDatetime.实例发生在同一小时内:
public static boolean isamehour (zoneeddatetime zoneedtimestamp, zoneeddatetime zoneedtimestamp){返回zoneedtimestamp . truncatedto (HOURS) .isEqual(zoneedtimestamptocompare . truncatedto (HOURS));}
我们可以看到2ZonedDatetime.对象实际上发生在同一小时内,即使它们的当地时间不同(分别为8:30和14:00):
ZonedDatetime Zonedtimestamp = Zoneddatetime.of(2019,8,10,8,30,0,0,0,zoneid.of(“America / new_york”));ZonedDatetime ZonedtimestAmptocompare = ZonedDatetime.of(2019,8,10,14,0,0,0,0,zoneid.of(“欧洲/柏林”);assertthat(DateTimecomparisonutils。Issamehour(Zonedtimestamp,Zonedtimestamptocompare),是(真实));
5.旧Java日期API中的比较
在Java 8之前,我们必须使用java.util.date.和java.util.calendar.用于操作日期/时间信息的类。旧的Java Date API的设计有很多缺陷,比如复杂且不是线程安全的。这java.util.date.Instance表示“即时”,而不是真正的日期。
其中一个解决方案是使用乔达时间图书馆。自从Java 8发布以来,建议使用迁移到Java 8日期/时间API。
同样到localDate.和LocalDateTime,两个java.util.date.和java.util.calendar.对象有后()那前()那相比于()和等于()比较两个日期实例的方法。日期与瞬间进行比较,在毫秒的水平上:
Date FirstDate = Todate(localDateTime.of(2019,8,10,0,00,00));Date Dignddate = atdate(localDateTime.of(2019,8,15,0,00,00));Assertthat(首页为代理(仲裁员),是(false));assertthat(strealdate.Before(刚刚),是(真实));assertthat(firstdate.compareto(仲裁员),是(-1));Assertthat(首次换算(仲裁牌),是(false));
为了更复杂的比较,我们可以使用dateutils.来自Apache Commons Lang.图书馆。这个类包含许多便于处理的方法日期和日历对象:
公共静态Boolean Issameday(日期日期,日期DateTocompare){returnateutils.issamseamise(日期,DateTocompart);}公共静态布尔issamehour(日期日期,日期datetocompare){returnateutils.truncatequals(日期,datetocompart,calendar.hour);}
要比较源自不同API的日期对象,我们应该首先进行适当的转换,只能应用比较。我们可以找到更多细节将日期转换为localdate或localDateTime和Back教程。
六,结论
在本文中,我们探索了在Java中比较日期实例的不同方法。
Java 8日期/时间类具有丰富的API,用于比较日期,有或没有时间和时区。我们还看到了如何在一天,小时,分钟等的粒度上比较日期。
可提供文章中提到的所有代码片段,包括其他示例,可用在GitHub。