【问题标题】:clj-time - how to get local-date from curent time in a different timezoneclj-time - 如何从不同时区的当前时间获取本地日期
【发布时间】:2021-03-21 03:16:48
【问题描述】:

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

我怎样才能做到这一点?

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

【问题讨论】:

    标签: clojure timezone clj-time


    【解决方案1】:

    我不知道Clojure。所以我会使用你可以翻译的Java语法。

    我坐在美国/圣保罗(或其他随机时区)

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

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

    在经过感兴趣的时区时致电LocalDate.now

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

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

    您可以通过调用isEqualisBeforeisAfter 来比较LocalDate 对象。

    LocalDate localDate = LocalDate.of( 2021 , Month.JANUARY , 23 ) ;
    boolean isCurrentDateInLondonBeforeThatDate = currentDateInLondon.isBefore( localDate ) ;
    

    【讨论】:

      【解决方案2】:

      注意:

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

      【讨论】:

      • 根据您当前的时间和区域,其他区域会提前或落后一天。所以我认为 OP 会问“明天在伦敦吗”
      • 除非您有 LocalDateTime 和 TimeZone,否则仍然无法回答该问题。然后您可以将每个转换为 Instant 并进行比较。
      • 是的@cfrick 是对的。当前日期在世界不同地区有所不同,但我需要伦敦的当前日期,无论服务器上设置了哪个时区。
      • 在这种情况下,Basil 显示了您需要的答案:LocalDate.now( ZoneId.of( "Europe/London" ))。通常最好将 Java 互操作与 java.time 一起使用。另请注意,旧的 clj-time 库已被弃用。
      【解决方案3】:

      似乎没有函数可以从中获取LocalDate DateTimeclj-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 在圣保罗和 因此,伦敦“严格追随”圣保罗 日期——或者在伦敦已经是“明天”了)

      【讨论】:

        猜你喜欢
        • 2015-08-16
        • 2021-09-26
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 2014-02-22
        • 2012-02-27
        • 1970-01-01
        • 2012-12-29
        相关资源
        最近更新 更多