Clojure преобразует каждый литерал #inst
в java.util.Date
объект.Все, что вам нужно, это встроенный метод .toInstant()
:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test)
(:import [java.time ZonedDateTime ZoneId]))
(defn inst->date-time
"Convert a java.time.Instant to a DateTime for the supplied ZoneId"
[inst zoneid]
(.toLocalDate zdt-utc
(ZonedDateTime/ofInstant instant zoneid)))
(dotest
(let [may-4 #inst "2018-05-04T01:23:45.678-00:00" ; a java.util.Date
instant (.toInstant may-4) ]
(spyxx may-4)
(spyx instant)
(println "utc =>" (inst->date-time instant (ZoneId/of "UTC")))
(println "nyc =>" (inst->date-time instant (ZoneId/of "America/New_York")))
))
с результатом
may-4 => <#java.util.Date #inst "2018-05-04T01:23:45.678-00:00">
instant => #object[java.time.Instant 0x2207eb9f "2018-05-04T01:23:45.678Z"]
utc => #object[java.time.LocalDate 0x62b5a16f 2018-05-04]
nyc => #object[java.time.LocalDate 0x379b6a27 2018-05-03]
Это расширение к j.u.Date
было добавлено в Java одновременно с java.time
пакет точно для облегчения перехода кода от java.util.Date
к java.time
.
Обратите внимание, что вы все равно должны быть осторожны, так как выборочный момент дает два разных объекта LocalDate
, в зависимости от временииспользуемая зона.
Если вы работаете с пакетом java.time
, вас могут заинтересовать некоторые вспомогательные функции , которые я написал. В модульных тестах приведены хорошие примеры как вспомогательных функций, так и взаимодействия с нативными java.time
функциями.
Если вы ищете функцию там и не находите ее, естьхороший шанс, что он уже существует в пакете java.time
, и его легко использовать напрямую через взаимодействие с Java.java.time
- очень хорошо продуманная библиотека (автор предыдущей библиотеки Joda Time
).Большинство функций java.time
просты и просты в использовании из Clojure, и им не нужна функция обертки.