我如何解构一个瞬间并从 java-time 库中提取年、月等

How can I destructure an instant and extract year, month, etc from java-time library

我正在尝试解构一个 instant 并获取年、月、日。

我试过 java-time/as 功能但没有成功。

(ns myproject.time-test
  (:require [java-time :as jt])
  (:gen-class))

(def curr-time (jt/instant (System/currentTimeMillis)))

(jt/as curr-time :year)

谁能给我指出正确的方向?

(ns mastering.Whosebug
    (:import
        (java.time ZoneId)))

    (.. (jt/instant)
            (atZone (ZoneId/systemDefault))
            (getYear))

其他方法如getMonthValuegetMinute也可用。

你可以这样 "extraction":

(let [i       (.. (jt/instant)
                (atZone (ZoneId/systemDefault)))
      extract (juxt (memfn getYear) (memfn getMinute))]
    (extract i))

; => [2018 37]

我会在没有 .. 的情况下这样做,以明确您正在使用 Java 互操作(看起来 clojure.java-time 没有包装器可以从 Instant 转换为分区日期时间:

(-> (jt/instant)
    (.atZone (ZoneId/systemDefault))  ; => java ZonedDateTime obj
    (.getYear))

 => 2018

还有其他可能有用的方法:

(jt/zoned-date-time)              => #object[java.time.ZonedDateTime 0x2585437a 
                                     "2018-07-19T11:42:37.093731-07:00[America/Los_Angeles]"]

(jt/year (jt/zoned-date-time))    => #object[java.time.Year 0x74694f06 "2018"]
(jt/year)                         => #object[java.time.Year 0x16c69c47 "2018"]

还有

(jt/as (jt/zoned-date-time) :year :month-of-year :day-of-month)   =>   (2018 7 19)

另一种将 Instant 转换为 ZonedDateTime 的方法:

  (let [zdt (ZonedDateTime/ofInstant (jt/instant) (ZoneId/systemDefault))]
    (.getYear zdt)         => 2018
    (.getMonth zdt)        => #object[java.time.Month 0x403d9a5b "JULY"]
    (.getDayOfMonth zdt)   => 19