将字符串时间与本地服务器时间进行比较
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/Kolkata
或 America/Montreal
之类的时区是特定区域过去、现在和未来对其与 UTC 的偏移量的更改历史。夏令时 (DST) 等异常意味着偏移量发生变化。
如果您知道所有输入都在 GMT/UTC 中,请使用 OffsetDateTime
。如果输入可能使用时区,则解析为 ZonedDateTime
个对象。
这种输入数据格式很糟糕。如果您有任何控制权,请在将日期时间值作为文本交换时使用标准 ISO 8601 格式。
所有这些都已在 Stack Exchange 上多次介绍。发帖前请仔细搜索。并搜索 Stack Overflow 以了解更多信息。我在这里保持简短的回答,因为这是重复的。
有一个具有特定日期格式的字符串对象。
需要检查 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/Kolkata
或 America/Montreal
之类的时区是特定区域过去、现在和未来对其与 UTC 的偏移量的更改历史。夏令时 (DST) 等异常意味着偏移量发生变化。
如果您知道所有输入都在 GMT/UTC 中,请使用 OffsetDateTime
。如果输入可能使用时区,则解析为 ZonedDateTime
个对象。
这种输入数据格式很糟糕。如果您有任何控制权,请在将日期时间值作为文本交换时使用标准 ISO 8601 格式。
所有这些都已在 Stack Exchange 上多次介绍。发帖前请仔细搜索。并搜索 Stack Overflow 以了解更多信息。我在这里保持简短的回答,因为这是重复的。