拥有一个具有特定日期格式的字符串对象。
需要检查dateStr是否在本地计算机上的当前时间之后。
无法进行转化和LocalDateTime
String dateStr = "Oct 27 2017 02:29:00 GMT+0000";
public static final String DATE_FORMAT = "MMM dd yyyy HH:mm:ss zzzZ";
我知道下面的代码中使用LocalDateTime
public static boolean isFutureDate(String dateStr){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter);
return(dateTime.isAfter(LocalDateTime.now()));
}
麻烦在于时区和日期转换。 请帮助找到正确的方法来检查dateStr是否在Java 8的当前本地日期之后?
答案 0 :(得分:4)
Local…
类型没有时区您使用了错误的数据类型。
包括Local…
在内的LocalDateTime
类型故意没有时区概念或偏离UTC的概念。因此,他们不代表时间线上的一个时刻,只是对一系列可能时刻的粗略概念。仅在时区未知或不相关时使用LocalDateTime
;从来没有在历史上的实际时刻使用它。
使用OffsetDateDate
表示具有偏离UTC的值,小时数和分钟数。
对具有指定时区的值使用ZonedDateTime
。 Asia/Kolkata
或America/Montreal
等时区是特定区域对其偏离UTC的过去,现在和将来更改的历史记录。夏令时(DST)等异常意味着对偏移量的更改。
如果您知道所有输入都是GMT / UTC,请使用OffsetDateTime
。如果输入可能使用时区,则解析为ZonedDateTime
个对象。
这种输入数据格式很糟糕。如果您有任何控件,请在将日期时间值作为文本交换时使用标准ISO 8601格式。
所有这些已经在Stack Exchange上多次覆盖。请在发布前仔细搜索。并搜索Stack Overflow以了解更多信息。我在这里简短地回答了我的答案,因为这是重复的。
答案 1 :(得分:3)
解析为LocalDateTime
时,你忽略了偏移量(+0000
),我不确定这是不是你真正想要的。
在这种情况下,+0000
偏移量表示日期/时间是2017年10月27日 th 2017上午02:29 UTC 。当您解析为LocalDateTime
时,您忽略了偏移量(因此它仅表示“2017年10月27日 th 2017 02:29 AM”,未附加到任何时区)并与之比较您当地的日期/时间(或JVM默认时区的当前日期/时间)。
如果您想进行也考虑偏移的比较,您可以将其解析为OffsetDateTime
并转换为Instant
以将其与实际UTC时刻进行比较,而不管时区如何。
此外,月份名称是英文(我假设它是英文,但您可以相应地更改),因此您必须在格式化程序中java.util.Locale
(如果您没有设置区域设置,它将使用JVM默认值,并且不保证始终为英语):
// parse to OffsetDateTime (use the same formatter)
String dateStr = "Oct 27 2017 02:29:00 GMT+0000";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss zzzZ", Locale.US);
OffsetDateTime odt = OffsetDateTime.parse(dateStr, fmt);
// compare Instant's
System.out.println(odt.toInstant().isAfter(Instant.now()));
虽然它现在适合您,但请记住,即使在运行时,也可以在不事先通知的情况下更改默认语言环境。如果您的输入具有区域设置敏感日期(例如月份名称),则最好如上所述指定它。