tl;博士
LocalDate
.parse( "2021-01-23" )
.isBefore(
LocalDate.now(
ZoneId.of( "Africa/Tunis" )
)
)
… 或:
try
{
org.threeten.extra.LocalDateRange range =
LocalDateRange.of(
LocalDate.of( "2021-01-23" ) ,
LocalDate.of( "2021-02-21" )
)
;
if( range.isAfter(
LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
) { … }
else { … handle today being within or after the range. }
} catch ( java.time.DateTimeException e ) {
// Handle error where end is before start.
}
详情
其他答案忽略了time zone的关键问题。
其他答案使用过时的类。
避免使用旧的日期时间类
与最早的 Java 版本捆绑在一起的旧日期时间类设计不佳、令人困惑且麻烦。避免使用 java.util.Date/.Calendar 和相关类。
java.time
LocalDate
对于仅日期值、没有时间和时区,请使用 LocalDate 类。
LocalDate start = LocalDate.of( 2016 , 1 , 1 );
LocalDate stop = start.plusWeeks( 1 );
时区
请注意,虽然LocalDate 不存储时区,但确定诸如“今天”之类的日期需要时区。对于任何给定的时刻,日期可能因世界各地的时区而异。例如,巴黎的新一天比蒙特利尔更早。巴黎午夜过后的片刻,蒙特利尔仍是“昨天”。
如果您只有offset-from-UTC,请使用ZoneOffset。如果您有完整的时区(大陆/地区),请使用ZoneId。如果您想要 UTC,请使用方便的常量 ZoneOffset.UTC。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
使用isEqual、isBefore 和isAfter 方法可以轻松进行比较。
boolean invalidInterval = stop.isBefore( start );
我们可以检查今天是否包含在此日期范围内。在这里显示的逻辑中,我使用 Half-Open 方法,其中开头是 inclusive 而结尾是 exclusive。这种方法在日期时间工作中很常见。因此,例如,一周从星期一一直到但不包括下星期一。
// Is today equal or after start (not before) AND today is before stop.
boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ) ;
LocalDateRange
如果在这样的时间范围内进行大量工作,请考虑将ThreeTen-Extra 库添加到您的项目中。该库扩展了 java.time 框架,并且是可能添加到 java.time 的试验场。
ThreeTen-Extra 包含一个 LocalDateRange 类和方便的方法,例如 abuts、contains、encloses、overlaps 等。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获取 java.time 类?