简而言之
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 ) {
}
详情
其他答案忽略了时区这个关键问题。
其他答案使用过时的类。
避免使用旧的日期时间类
最早版本的Java捆绑的旧的日期时间类设计不佳、令人困惑且麻烦。请避免使用java.util.Date/.Calendar和相关类。
java.time
LocalDate
对于仅日期值,不带时间和时区,请使用LocalDate
类。
LocalDate start = LocalDate.of( 2016 , 1 , 1 );
LocalDate stop = start.plusWeeks( 1 );
时区
请注意,虽然LocalDate
不会存储时区信息,但是确定诸如“今天”之类的日期需要时区。对于任何给定的时刻,由于时区的不同,日期可能在世界各地有所不同。例如,在巴黎,新的一天比蒙特利尔早。在巴黎午夜后的一瞬间,在蒙特利尔仍然是“昨天”。
如果您只有一个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 );
我们可以检查今天是否包含在这个日期范围内。在这里展示的逻辑中,我使用了“半开放”方法,其中开始是“包含的”,而结束是“不包含的”。这种方法在日期时间工作中很常见。因此,例如,一周从星期一开始,但不包括下一个星期一。
// 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及更高版本中。这些类替代了令人头疼的旧遗留日期时间类,例如java.util.Date
, Calendar
, 和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
如需了解更多信息,请参见 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。无需字符串,也不需要 java.sql.*
类。
如何获取 java.time 类?
DateUtils.isSameDay(someday, new Date());
。 - Nikolai Shevchenko