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

Compare String time to Local Server Time

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

中的当前本地日期之后

解析为 LocalDateTime 时,您忽略了偏移量 (+0000),我不确定这是否是您真正想要的。

在这种情况下,+0000 偏移量意味着 date/time 是 2017 年 10 月 27 日th 02:29 上午 UTC。当您解析为 LocalDateTime 时,您将忽略偏移量(因此它仅表示 "October 27th 2017 at 02:29 AM",不附加到任何时区)并与本地 date/time(或当前 date/time 在 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()));

尽管它现在对您有效,但请记住,即使在运行时,默认语言环境也可以更改,恕不另行通知。如果您的输入有地区敏感日期(例如月份名称),最好像上面那样指定。

Local…类型没有时区

您使用的数据类型错误。

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

使用 OffsetDateDate 表示具有与 UTC 的偏移量、小时数和分钟数的值。

对具有指定时区的值使用 ZonedDateTime。诸如 Asia/KolkataAmerica/Montreal 之类的时区是特定区域过去、现在和未来对其与 UTC 的偏移量的更改历史。夏令时 (DST) 等异常意味着偏移量发生变化。

如果您知道所有输入都在 GMT/UTC 中,请使用 OffsetDateTime。如果输入可能使用时区,则解析为 ZonedDateTime 个对象。

这种输入数据格式很糟糕。如果您有任何控制权,请在将日期时间值作为文本交换时使用标准 ISO 8601 格式。

所有这些都已在 Stack Exchange 上多次介绍。发帖前请仔细搜索。并搜索 Stack Overflow 以了解更多信息。我在这里保持简短的回答,因为这是重复的。