1

我坐在美国/圣保罗(或其他一些随机时区),现在我想获得欧洲/伦敦当前日期的 LocalDate 。

我怎样才能做到这一点?

(我有一个我知道在伦敦的 localDate,我想使用 clj-time.core/after 检查它是否早于当前日期?)

4

3 回答 3

3

我不知道Clojure。因此,我将使用您可以翻译的 Java 语法。

我坐在 America/Sao_Paulo(或其他一些随机时区)

无关紧要。无论您的肚子是在东京、雷克雅未克还是圣保罗,这与询问时区的当前日期无关Europe/London

现在我想获取欧洲/伦敦当前日期的 LocalDate 。

LocalDate.now在经过感兴趣的时区时调用。

ZoneId zoneId = ZoneId.of( "Europe/London" ) ;
LocalDate currentDateInLondon = LocalDate.now( zoneId ) ;

我有一个我知道在伦敦的 localDate,我想检查它是否在当前日期之前

LocalDate您可以通过调用isEqualisBefore和来比较对象isAfter

LocalDate localDate = LocalDate.of( 2021 , Month.JANUARY , 23 ) ;
boolean isCurrentDateInLondonBeforeThatDate = currentDateInLondon.isBefore( localDate ) ;
于 2020-12-10T08:49:58.170 回答
2

笔记:

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它们,您可能会觉得这些功能很有用。

于 2020-12-09T17:57:02.340 回答
1

似乎没有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,因此伦敦在仅查看日期时“严格在”圣保罗之后——或者在伦敦已经是“明天”)

于 2020-12-09T21:22:15.547 回答