首页 > 解决方案 > 你可以使用tick/java.time 将粒度更细的时间类型转换为粒度更细的时间类型吗?

问题描述

我想知道是否有一种方法可以使用tick(或基于刻度的 java.time)从粒度较小的时间类型转换为粒度更细的时间类型?

这不起作用:

(-> (t/date "2015") (t/date))
;; => No implementation of method: :date of protocol: #'tick.core/IExtraction found
;; => for class: java.time.Year

对我来说,考虑到您基本上是在添加数据,因此可能无法朝这个方向转换是有道理的,因此您必须做出假设,例如选择月份和日期来选择日期。鉴于此,您可以从更多粒度“投射”到更少粒度:

(-> (t/date "2015-01-01") (t/year))
;; => #time/year "2015"

我能想到的唯一方法是通过字符串进行转换:

(->> (t/year "2015")
     (t/format (t/formatter "yyyy"))
     (#(str % "-01-01"))
     (t/date))
;; => #time/date "2015-01-01"

但这感觉有点老套。这样做的正确方法是什么?

标签: clojurejava-time

解决方案


(require '[clojure.instant :as ci])
(ci/read-instant-timestamp "2015")
=> #inst"2015-01-01T00:00:00.000000000-00:00"

或者

(t/zoned-date-time 2015)

推荐阅读