简而言之
Joda-Time已被java.time类和ThreeTen-Extra项目所取代。
LocalDateRange
和Interval
类表示时间跨度使用半开放定义。因此,询问开始是否包含返回true
。
LocalDateRange.of( // `org.threeten.extra.LocalDateRange` class represents a pair of `LocalDate` objects as a date range.
LocalDate.of( 2018, 8 , 2 ) , // `java.time.LocalDate` class represents a date-only value, without time-of-day and without time zone.
LocalDate.of( 2018 , 8 , 20 )
) // Returns a `LocalDateRange` object.
.contains(
LocalDate.now() // Capture the current date as seen in the wall-clock time used by the people of the JVM’s current default time zone.
)
true
java.time
FYI,
Joda-Time 项目现在处于
维护模式,团队建议迁移到
java.time类。请参见
Oracle的教程。
仅日期
显然,您可能关心日期而不是时间。如果是这样,请使用LocalDate
类。
如果您想管理日期范围,请将 ThreeTen-Extra 库添加到您的项目中。这将使您可以访问 LocalDateRange
类。
该类提供了几种比较方法:abuts
,contains
,encloses
,equals
,intersection
,isBefore
,isAfter
,isConnected
,overlaps
,span
和 union
。
LocalDateRange r =
LocalDateRange.of(
LocalDate.of( 2018, 8 , 2 ) ,
LocalDate.of( 2018 , 8 , 20 )
)
;
LocalDate target = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ; // Capture the current date as seen in the wall-clock time used by the people of a particular time zone.
boolean contains = r.contains( target ) ;
日期和时间
如果您关心特定时区的日期和时间,请使用 ZonedDateTime
类。
从您的 LocalDate
开始,让该类确定一天的第一个时刻。由于诸如夏令时(DST)等异常情况,一天并不总是从00:00:00开始。
以 continent/region
的格式指定适当的时区名称,例如America/Montreal
、Africa/Casablanca
或Pacific/Auckland
。永远不要使用三到四个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,没有标准化,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ; // Or "America/New_York", etc.
ZonedDateTime zdtStart = LocalDate.of( 2018, 8 , 2 ).atStartOfDay( z ) ;
ZonedDateTime zdtStop = LocalDate.of( 2018, 8 , 20 ).atStartOfDay( z ) ;
ZonedDateTime zdtTarget = ZonedDateTime.now( z ) ;
用
ThreeTen-Extra中的
Interval
表示一个范围。这个类表示一对
Instant
对象。一个
Instant
是UTC时间中的一个瞬间,总是在UTC时间中。我们可以通过简单地提取
Instant
来轻松地从我们的时区时刻调整到UTC。同一时刻,在时间线上的同一点,不同的挂钟时间。
Instant instantStart = zdtStart.toInstant() ;
Instant instantStop = zdtStop.toInstant() ;
Instant instantTarget = zdtTarget.toInstant() ;
Interval interval = Interval.of( instantStart , intervalStop ) ;
boolean contains = interval.contains( instantTarget ) ;
半开区间
定义时间跨度的最佳方法通常是采用半开区间方法。这意味着开始时间是包含的,而结束时间是不包含的。
上面看到的ThreeTen-Extra
范围类(LocalDateRange
和Interval
)中的比较都使用半开区间方法。因此,询问起始日期或起始时刻是否包含在范围内将得到一个true
。
关于 java.time
java.time 框架已经内置于 Java 8 及以后的版本中。这些类替代了旧的、麻烦的遗留日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到java.time类。
了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,无需java.sql.*
类。
如何获取java.time类?
ThreeTen-Extra 项目扩展了 java.time 的附加类。该项目是 java.time 可能未来添加的一个试验场。您可能会在此处找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, 和 更多。