比较字符串时间与本地服务器时间

时间:2017-10-27 14:41:18

标签: date java-8 java-time datetime-parsing datetime-conversion

拥有一个具有特定日期格式的字符串对象。 需要检查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的当前本地日期之后?

2 个答案:

答案 0 :(得分:4)

Local…类型没有时区

您使用了错误的数据类型。

包括Local…在内的LocalDateTime类型故意没有时区概念或偏离UTC的概念。因此,他们代表时间线上的一个时刻,只是对一系列可能时刻的粗略概念。仅在时区未知或不相关时使用LocalDateTime;从来没有在历史上的实际时刻使用它。

使用OffsetDateDate表示具有偏离UTC的值,小时数和分钟数。

对具有指定时区的值使用ZonedDateTimeAsia/KolkataAmerica/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()));

虽然它现在适合您,但请记住,即使在运行时,也可以在不事先通知的情况下更改默认语言环境。如果您的输入具有区域设置敏感日期(例如月份名称),则最好如上所述指定它。