如何用Clojure的clojure.java-time库解析UTC并格式化为本地时间?
问题原因与解决方法
你出错的核心是**jt/with-offset只是替换时间的偏移量标签,不会真正把时间转换到目标时区**。
原时间是UTC的2023-02-27T01:00Z,调用(jt/with-offset X (jt/zone-offset))后,只是把这个时间的偏移量改成了-05:00,但时间值本身还是01:00——这相当于你告诉系统"这个时间是UTC-5时区的01:00",而不是把UTC的01:00转换成UTC-5时区的对应时间,所以格式化后自然还是01:00。
正确的时区转换代码
要实现"将UTC时间转换为本地时区时间",你需要用保持时间点不变的时区转换方法,比如jt/with-zone-same-instant(针对OffsetDateTime转换到ZonedDateTime):
(as-> "20230227T010000Z" X (jt/offset-date-time "yyyyMMdd'T'HHmmssX" X) ; 解析为UTC时间:2023-02-27T01:00Z (jt/with-zone-same-instant X (jt/system-default-zone)) ; 转换为系统默认本地时区,此时UTC的01:00会变成UTC-5的2023-02-26T20:00 (jt/format "HH:mm" X)) ; 输出"20:00"(如果用hh:mm会输出"08:00",12小时制)
或者如果你想直接得到本地时间对象,也可以转换为LocalDateTime:
(as-> "20230227T010000Z" X (jt/offset-date-time "yyyyMMdd'T'HHmmssX" X) (jt/to-local-date-time X (jt/system-default-zone)) ; 直接转换为本地时区的LocalDateTime (jt/format "HH:mm" X))
这两种方式都会真正把UTC时间点转换为本地时区的对应时间,而不是单纯替换偏移量标签。
内容的提问来源于stack exchange,提问作者robbie.huffman
相关产品推荐
相关产品推荐

