【发布时间】:2021-03-21 03:16:48
【问题描述】:
我坐在美国/圣保罗(或其他随机时区),现在我想获取欧洲/伦敦当前日期的 LocalDate。
我怎样才能做到这一点?
(我有一个我知道在伦敦的 localDate,我想使用 clj-time.core/after 检查它是否早于当前日期?)
【问题讨论】:
我坐在美国/圣保罗(或其他随机时区),现在我想获取欧洲/伦敦当前日期的 LocalDate。
我怎样才能做到这一点?
(我有一个我知道在伦敦的 localDate,我想使用 clj-time.core/after 检查它是否早于当前日期?)
【问题讨论】:
我不知道Clojure。所以我会使用你可以翻译的Java语法。
我坐在美国/圣保罗(或其他随机时区)
无关紧要。无论您的肚子是在东京、雷克雅未克还是圣保罗,这与询问Europe/London 时区的当前日期无关。
现在我想获取欧洲/伦敦当前日期的 LocalDate。
在经过感兴趣的时区时致电LocalDate.now。
ZoneId zoneId = ZoneId.of( "Europe/London" ) ;
LocalDate currentDateInLondon = LocalDate.now( zoneId ) ;
我有一个我知道在伦敦的 localDate,我想检查它是否早于当前日期
您可以通过调用isEqual、isBefore 和isAfter 来比较LocalDate 对象。
LocalDate localDate = LocalDate.of( 2021 , Month.JANUARY , 23 ) ;
boolean isCurrentDateInLondonBeforeThatDate = currentDateInLondon.isBefore( localDate ) ;
【讨论】:
clj-time 库基于旧的 Joda Time 库。这两个都已被弃用,取而代之的是java.time(自JDK 8 起可用)。最好将 Java 互操作与 java.time 一起使用,而不是旧的 clj-time 库。
包java.time 基本上是Joda Time 2.0,但为了更简洁和纠正一些极端情况而重写。两者都是由同一个人创建的。
在 Java 中,LocalDate 没有时区。这就是重点。
它用于诸如生日之类的事情,例如 1999 年 12 月 31 日,我们认为您的生日没有时区。
出于同样的原因,LocalDate 没有任何时间与之关联,就像您的生日被认为是一整天一样。
有关更多信息,请参阅java.time 文档:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html
来自 JavaDocs:
日期和时间
Instant 本质上是一个数字时间戳。这 当前 Instant 可以从时钟中检索。这对 一个时间点的记录和持久性,过去一直是 与存储 System.currentTimeMillis() 的结果相关联。
LocalDate 存储没有时间的日期。这存储了一个日期 '2010-12-03' 可以用来存储生日。
LocalTime 存储没有日期的时间。这存储了一个时间 '11:30' 可用于存储开盘或关盘时间。
LocalDateTime 存储日期和时间。这存储了一个日期时间,如 '2010-12-03T11:30'。
ZonedDateTime 存储带有时区的日期和时间。这很有用 如果您想对日期和时间进行准确计算 考虑 ZoneId,例如“Europe/Paris”。在可能的情况下,它是 建议使用没有时区的更简单的类。广泛的 时区的使用往往会增加相当大的复杂性 应用。
辅助功能:
我添加了some convenience functions 以帮助您使用java.time,您可能会觉得这很有用。
【讨论】:
LocalDateTime 和 TimeZone,否则仍然无法回答该问题。然后您可以将每个转换为 Instant 并进行比较。
LocalDate.now( ZoneId.of( "Europe/London" ))。通常最好将 Java 互操作与 java.time 一起使用。另请注意,旧的 clj-time 库已被弃用。
似乎没有函数可以从中获取LocalDate
DateTime 或 clj-time 中的类似名称——但 Joda Time 有
.toLocalDate。所以例如你可以这样做:
(defn date-at-zone
[instant zone-id]
(.toLocalDate
(t/to-time-zone
instant
(t/time-zone-for-id zone-id))))
(let [instant (t/date-time 2020 12 12 1)
london-date (date-at-zone instant "Europe/London")
sao-paulo-date (date-at-zone instant "America/Sao_Paulo")]
(print (map str [instant london-date sao-paulo-date (t/after? london-date sao-paulo-date)])))
; → (2020-12-12T01:00:00.000Z 2020-12-12 2020-12-11 true)
(例如 2020-12-12T01:00 Zulu 仍然是 2020-12-11 在圣保罗和 因此,伦敦“严格追随”圣保罗 日期——或者在伦敦已经是“明天”了)
【讨论】: