Clojure java-time:使用 millis 实现即时

Clojure java-time: getting instant with millis

我正在尝试使用 java 时间将本地日期转换为毫秒的即时日期,但即时 returns 是没有毫秒的时间戳。

(def UTC (java-time/zone-id "UTC")

(defn local-date-to-instant [local-date] 
  (-> local-date
      (.atStartOfDay UTC)
      java-time/instant))

(local-date-to-instant (java-time/local-date))
=> #object[java.time.Instant 0xdb3a8c7 "2021-05-13T00:00:00Z"]

但是

(java-time/instant)
=> #object[java.time.Instant 0x1d1c27c8 "2021-05-13T13:12:31.782Z"]

下游服务需要此格式的字符串:yyyy-MM-ddTHH:mm:ss.SSSZ.

LocalDate 没有时间部分。 .atStartOfDay 在所有时间字段中置零。 LocalDateTime 可以通过 .toInstant.

转换为 Instant

您需要使用 DateTimeFormatter。然后你可以写这样的代码:

LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
String text = date.format(formatter);

特别是,查看这些格式模式代码:

S   fraction-of-second  fraction    978
A   milli-of-day        number      1234
n   nano-of-second      number      987654321

我认为 S 代码最适合您的目的。由于文档没有提供所有详细信息,因此您必须进行一些试验。

这是一个例子:

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [schema.core :as s]
    [tupelo.java-time :as tjt]
  )
  (:import
    [java.time Instant LocalDate LocalDateTime ZonedDateTime]
    [java.time.format DateTimeFormatter]
  ))

(dotest
  (let [top-of-hour (tjt/trunc-to-hour (ZonedDateTime/now))
        fmt         (DateTimeFormatter/ofPattern "yyyy-MM-dd HH:mm:ss.SSS")
       ]
    (spyx top-of-hour)
    (spyx (.format top-of-hour fmt))
  ))

结果

-----------------------------------
   Clojure 1.10.3    Java 15.0.2
-----------------------------------

Testing tst.demo.core
top-of-hour => #object[java.time.ZonedDateTime 0x9b64076 "2021-05-13T07:00-07:00[America/Los_Angeles]"]
(.format top-of-hour fmt) => "2021-05-13 07:00:00.000"

以上内容来自this template project and the library tupelo.java-time.

创建一个 DateTimeFormatter 以毫秒(3 个小数位)打印 ISO 瞬间,即使它们是零:

(ns steffan.overflow
  (:require [java-time :as jt])
  (:import (java.time.format DateTimeFormatterBuilder)))

(def iso-instant-ms-formatter
  (-> (DateTimeFormatterBuilder.) (.appendInstant 3) .toFormatter))

使用示例:

(def today-inst (jt/truncate-to (jt/instant) :days))

(str today-inst)                                ; => "2021-05-13T00:00:00Z"
(jt/format iso-instant-ms-formatter today-inst) ; => "2021-05-13T00:00:00.000Z"