【发布时间】:2021-04-22 02:59:50
【问题描述】:
需要查看某个日期(例如:到期日)是否大于或等于今天。目前已经使用 JODA 时间库来实现这种简单的比较。甚至有些帖子也推荐this。
但最近发现时区有些问题。日期存在于 PST 中,当转换为 LocalDate 时,在太平洋标准时间下午 5:00 时转换为假,此时它应该为真 -
LocalDate now = LocalDate.fromDateFields(new Date()); // Current date in PST
LocalDate expiryDate = LocalDate.fromDateFields(expiresOn); // expiresOn is java.util.Date
boolean notExpired = expiryDate.isEqual(now) || expiryDate.isAfter(now);
仔细观察,LocalDate expiryDate 使用的是 UTC 年表。所以在太平洋标准时间下午 5:00,当变量 expiryDate 包含包含 "2021-01-16" 时,变量 now 变为 "2021- 01-17"
请推荐,解决这个问题的更好方法是什么。 我试图了解,使用 joda time 可能会获得哪些特殊优势,因为使用 SimpleDateFormatter 可以实现同样的同情。
【问题讨论】:
-
始终以 UTC 时间处理并调整到用户的时区。
-
您必须确定“今天”在您的上下文中的含义。如果“今天”应该在您的代码运行的时区中解释,那么您希望将两个时间都转换为本地时区,然后比较该时间的日期部分。但是,如果您想要一个无论您在哪个时区都始终给出相同答案的比较,那么您需要将两个时间都转换为您想用来定义“今天”的任何时区。在任何情况下,您都需要将两个时间值转换为一个共同的时区,然后再比较它们的日期才有意义......
-
一旦您了解了必要的逻辑并决定如何定义“今天”,那么您应该能够使用几乎任何时间/日期 API 编写正确的解决方案。如果您可以假设 Java 是相当新的(Java 8+)版本,那么我建议您使用 Java 内置的较新的日期/时间 API,而不是使用 JodaTime。无论如何,我都会远离旧的 Java API。
-
所以美洲的到期时间应该更晚,因为例如,1 月 16 日在美洲的截止日期要晚于亚洲和欧洲?
-
PST 是什么意思?您指的是太平洋时间(PST 还是 PDT,具体取决于一年中的时间)?
标签: java jodatime java.util.date