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"
我正在尝试使用 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"