我坐在美国/圣保罗(或其他一些随机时区),现在我想获得欧洲/伦敦当前日期的 LocalDate 。
我怎样才能做到这一点?
(我有一个我知道在伦敦的 localDate,我想使用 clj-time.core/after 检查它是否早于当前日期?)
我不知道Clojure。因此,我将使用您可以翻译的 Java 语法。
我坐在 America/Sao_Paulo(或其他一些随机时区)
无关紧要。无论您的肚子是在东京、雷克雅未克还是圣保罗,这与询问时区的当前日期无关Europe/London
。
现在我想获取欧洲/伦敦当前日期的 LocalDate 。
LocalDate.now
在经过感兴趣的时区时调用。
ZoneId zoneId = ZoneId.of( "Europe/London" ) ;
LocalDate currentDateInLondon = LocalDate.now( zoneId ) ;
我有一个我知道在伦敦的 localDate,我想检查它是否在当前日期之前
LocalDate
您可以通过调用isEqual
、isBefore
和来比较对象isAfter
。
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 中, aLocalDate
没有时区。这就是重点。
它用于诸如生日之类的事情,例如 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”)的情况下执行准确的日期和时间计算,这将非常有用。在可能的情况下,建议使用没有时区的更简单的类。时区的广泛使用往往会给应用程序增加相当大的复杂性。
辅助功能:
我添加了一些便利功能来帮助您使用java.time
它们,您可能会觉得这些功能很有用。
似乎没有LocalDate
从 aDateTime
或类似中获取的功能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,因此伦敦在仅查看日期时“严格在”圣保罗之后——或者在伦敦已经是“明天”)