首页 > 解决方案 > clojure java-time - 日期向前移动一年?

问题描述

我对包装 Java 8 的 java.time api的clojure.java-time库的使用感到困惑。

我想要一个将字符串格式的日期从“yyyy-MM-dd'T'HH:mm:ss”格式转换为“MM/dd/YYYY hh:mm:ss a”格式的函数。

这是我的功能:


(require '[java-time :as jt])

(defn change-ds-format [in-ds]
  {:pre [string? in-ds ]}
  (let [input-format "yyyy-MM-dd'T'HH:mm:ss"  
        output-format "MM/dd/YYYY hh:mm:ss a"]
    (->> in-ds
         (jt/local-date-time input-format)
         (jt/format output-format)))) 

这看起来不错:

(change-ds-format "2019-12-28T00:00:00" )
;=> "12/28/2019 12:00:00 AM"

我不知道为什么要推迟到2020年?

(change-ds-format "2019-12-29T00:00:00" )
;=> "12/29/2020 12:00:00 AM"
;; Why is this one 2020 ???

我想这可能是一个时区偏移问题,但我不相信它应该转移到 2020 年。

标签: clojurejava-time

解决方案


因为yyyy不是YYYY

来自DateTimeFormatter 的 Oracle 文档

 ... snip...
u       year                        year              2004; 04
y       year-of-era                 year              2004; 04
...snip...
Y       week-based-year             year              1996; 96
w       week-of-week-based-year     number            27
...snip...

我对日期时间算术或细微差别不是很精通,但我相信在以周为基础的年份中,今年 12 月 30 日和 31 日计算为 2020 年,因为这些日期属于第 1 周,而不是第 52 周或第 53 周。


推荐阅读