界标准时间 2007 年 1 月 1 日(包 括)到世界标准时间 2008 年 1 月 1 日(不包括)”是一个时间间隔。时间间隔可以包括或不包括起始 瞬间和结束瞬间。
JSR 310 提供了 InstantInterval 类来表示时间间隔。要创建 InstantInterval 的实例,可以使用 多个工厂方法之一:
//Create some intervals.
ZonedDateTime time1 = systemClock.currentZonedDateTime();
try{Thread.sleep(1000)} //Use up some time
catch(InterruptedException e){System.out.println("Error")}
ZonedDateTime time2 = systemClock.currentZonedDateTime();
//Create an interval with inclusive start and exclusive end.
InstantInterval interval1 = InstantInterval.intervalBetween(
time1.toInstant(), time2.toInstant());
//Create an interval with exclusive start and inclusive end.
boolean startInclusive = false; boolean endInclusive = true;
InstantInterval interval2 = InstantInterval.intervalBetween(
time1.toInstant(), startInclusive,
time2.toInstant(), endInclusive);
使用 JSR 310 日期/时间类
前面的部分介绍了 5 个基本 JSR 310 日期/时间概念,并且说明如何实例化表示这些概念的类。本部 分演示一些可以使用 JSR 310 API 进行的日历计算。
对了进行演示,假设您正在开发的程序采用多个在不同时间发生并且按照特定时间间隔重复发生的事 件作为输入。该程序输出所有同时发生两个或更多个事件的时间。您可以使用一个 ZonedDateTime 和一 个 Duration 来表示在经过固定长度的时间之后重新发生的瞬间事件;要生成该事件的下一个实例,可以 向表示上一个实例的 ZonedDateTime 添加 Duration:
//ZonedDateTime firstTime is the time the event first occurs
//Duration repeatTime is the duration after which event recurs
//TimeZone defaultZone is your computer''s default time zone
ZonedDateTime secondTime = ZonedDateTime.dateTime(
firstTime.toInstant().plus(repeatTime), defaultZone);
JSR 310:一种新的Java日期/时间API(6)
时间:2011-07-29 Jesse Farnham
如果您具有一个在特定 数量的年、月或日之后重复发生的事件,则可以通过向表示上一个实例的 ZonedDateTime 添加一个 Period 来生成下一个实例:
//ZonedDateTime firstTime is the time the event first occurs
//Period repeatPeriod is the period after which event recurs
ZonedDateTime secondTime = firstTime.plus(repeatPeriod);
要测试两个瞬间事件是 否同时发生,可以使用 ZonedDateTime.equals(Object other) 方法:
//time1 and time2 are ZonedDateTimes representing events
if (time1.equals(time2)){
System.out.println("The two events occur simultaneously.");
}
如果您需要表示一个非瞬间事件,则使用 ZonedDateTime 并非最佳选择。不完全时间 更加适合于表示非瞬间事件(如年假)。要确定一个由 ZonedDateTime 表示的事件和一个由不完全时间 (例如,MonthDay)表示的事件是否同时发生,可以使用 MonthDay.matchesDate(LocalDate date) 方法 。如果 LocalDate(它是一个不带每日时间的日期)中的月和日字段与 MonthDay 中的月和日字段匹配, 则此方法返回 true。
//Monthday christmas is a partial representing December 25.
//ZonedDateTime time1 represents an instantaneous event
if (christmas.matchesDate(time1.localDate())){
System.out.println("The event occurs on Christmas.");
}
最后,通过 InstantInterval 可以最佳地表示按照特 |