TL;博士
LocalDate.parse("15/02/13" , DateTimeFormatter.ofPattern("dd/MM/uu"))
.isBefore(LocalDate.now(ZoneId.of("America/Montreal")))
详细
其他的答案是有关的布尔逻辑,你的错误是正确的。
此外,您正在使用麻烦的旧日期时间类,现在是遗留下来的,由java.time类代替。
上面提到的布尔逻辑更容易使用java.time.LocalDate
类中的isBefore
& isAfter
方法。
LocalDate
的LocalDate
类表示没有时间一天和不同时区的日期,唯一的价值。
时区对确定日期至关重要。对于任何特定的时刻,日期因地区而异。例如,Paris France午夜后几分钟是新的一天,而在Montréal Québec仍然是“昨天”。
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
DateTimeFormatter
为了解析的输入字符串作为日期时间值,使用DateTimeFormatter
类。
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uu");
String input = "15/02/13";
LocalDate ld = LocalDate.parse(input , f);
比较
比较LocalDate
对象,你可以调用的方法,如compareTo
,equals
,isAfter
,isBefore
,isEqual
。
String message = "ERROR - Message not set. Error # f633d13d-fbbc-49a7-9ee8-bcd1cfa99183." ;
if(ld.isBefore(today)) { // Before today.
message = "The date: " + ld + " is in the past, before today: " + today);
} else if(ld.isEqual(today)) { // On today.
message = "The date: " + ld + " is today: " + today);
} else if(ld.isAfter(today)) { // After today.
message = "The date: " + ld + " is in the future, later than today: " + today);
} else { // Double-check.
message = "ERROR – Unexpectedly reached Case Else. Error # c4d56437-ddc3-4ac8-aaf0-e0b35fb52bed.") ;
}
格式
顺便说一句,缺乏世纪的输入字符串的格式是不明智的。一年中使用两位数字会使日期难以阅读,造成更多歧义,并且使得解析更加困难,因为在违约世纪时各种软件的行为不同。现在我们可以在现代计算内存和存储中支付两位额外的数字。
将日期 - 时间值序列化为文本时,请使用实用且流行的ISO 8601标准格式。对于仅为约会的MMY-DD,如2016-10-22
。
关于java.time
的java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time项目现在位于maintenance mode,建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310。
从何处获取java.time类?
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
在当前*或*下一个等于当前(而不是*和*)之后,您的意思可能是下一个吗? – akaIDIOT 2013-02-15 10:21:53
哪一行给出了哪个确切的异常?另外,请使这个独立的代码片段(添加任何相关的导入,或完全限定类名称,并将其放入类和方法中,以便运行)。 – 2013-02-15 10:23:29