如何分解即时数据并从Java时间库中提取年,月等

时间:2018-07-19 16:04:12

标签: clojure java-time

我正在尝试破坏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)

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

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

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

也可以使用其他方法,例如getMonthValuegetMinute

您可以这样“提取”:

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

; => [2018 37]

答案 1 :(得分:1)

我会在没有..的情况下做到这一点,以明确您正在使用Java互操作(看来clojure.java-time没有包装程序可以将Instant从Invert转换为ZonedDateTime:

(-> (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