Еще одно решение с использованием нативного java.time
:
(ns tst.tupelo.java-time
(:import [ java.time Duration ZoneId ZonedDateTime ]))
; note that instants are in DESCENDING order
(let [instants ["2016-04-30T10:29:17.000-00:00"
"2016-03-24T12:13:12.000-00:00"
"2016-03-24T12:09:43.000-00:00"
"2016-03-23T13:19:03.000-00:00"
"2016-02-26T14:51:37.000-00:00"
"2016-01-20T16:55:24.000-00:00"]
zoned-date-times (mapv #(ZonedDateTime/parse %) instants)
zdt-pairs (partition 2 1 zoned-date-times)
durations (vec (for [[interval-stop interval-start] zdt-pairs]
(.toMinutes ; *** truncates ***
(Duration/between interval-start interval-stop))))]
с результатом:
durations => [53176 3 1370 37347 53156]
ОБРАТИТЕ ВНИМАНИЕ: эти значения обрезаны до целых минут, как указывалось в исходной проблеме.
Обсуждение:
Поскольку первые 2 ответа были неправильными, это показывает ценность использования встроенных утилит времени java.time
вместо попытки быстро написать собственное решение. В большинстве случаев мне проще использовать собственные классы и функции Java по сравнению с оболочкой Clojure, такой как clj-time
, которая оборачивает устаревшую библиотеку Joda-Time.
Внимание:
Начиная с Java 8, clj-time
(и библиотеку Joda Time, которую он оборачивает) следует считать устаревшим. От clj-time
домашней страницы :
Библиотека даты и времени для Clojure, упаковывающая библиотеку Joda Time.
На сайте Joda Time написано:
Обратите внимание, что начиная с Java SE 8 и далее пользователям предлагается перейти на
java.time (JSR-310) - основная часть JDK, которая заменяет эту
проект.
Также обратите внимание, что автор Joda-Time также является автором пакета java.time
, который расширяет Joda-Time и исправляет некоторые недостатки, которые были очевидны только с возрастом. Домашняя страница Joda-Time сама говорит:
Обратите внимание, что начиная с Java SE 8 и далее пользователям предлагается перейти на
java.time (JSR-310) - основная часть JDK, которая заменяет эту
проект.
Обновление
Поскольку исходные метки времени были (в основном) строками, я подумал, что OP может лучше подойти к этому решению. Если вы хотите использовать синтаксис Clojure #inst
, ответ будет еще проще:
; note that instants are in DESCENDING order
(let [instants [ #inst "2016-04-30T10:29:17.000-00:00"
#inst "2016-03-24T12:13:12.000-00:00"
#inst "2016-03-24T12:09:43.000-00:00"
#inst "2016-03-23T13:19:03.000-00:00"
#inst "2016-02-26T14:51:37.000-00:00"
#inst "2016-01-20T16:55:24.000-00:00"]
instants (mapv #(.toInstant %) instants)
inst-pairs (partition 2 1 instants)
durations (vec (for [[interval-stop interval-start] inst-pairs]
(.toMinutes ; *** truncates ***
(Duration/between interval-start interval-stop))))]
Обратите внимание, что новая функция отображения #(.toInstant %)
- единственное, что нужно изменить.