gpt4 book ai didi

datetime - Clojure 日期时间算术与#inst's

转载 作者:行者123 更新时间:2023-12-05 01:41:29 24 4
gpt4 key购买 nike

我有很多#inst 格式的日期,例如

(list #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")

我需要将它们之间的时间差计算为分钟的整数。

我搜索了 Clojure 时间库,但除了如何将它们转换为之外,关于#inst 的内容一无所知。

我如何使用#inst 的序列进行时间算术以获得差异并将差异转换为分钟整数?

感谢您的帮助。

最佳答案

另一种使用原生 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 的内置功能而不是尝试快速编写自己开发的解决方案的值(value)。在大多数情况下,我发现使用原生 Java 类和函数比使用像 clj-time 这样的 Clojure 包装器更容易,它包装了已弃用的库 Joda-Time。

警告:

从 Java 8 开始,clj-time(以及它包装的 Joda Time 库)应该被视为弃用。来自 the clj-time homepage :

A date and time library for Clojure, wrapping the Joda Time library.The Joda Time website says:

Note that from Java SE 8 onwards, users are asked to migrate tojava.time (JSR-310) - a core part of the JDK which replaces thisproject.

另请注意,Joda-Time 的作者也是 java.time 包的作者,它扩展了 Joda-Time 并纠正了一些随着时间的推移才显现出来的缺点。 The Joda-Time homepage本身说:

Note that from Java SE 8 onwards, users are asked to migrate tojava.time (JSR-310) - a core part of the JDK which replaces thisproject.


更新

由于原始时间戳(大部分)是字符串,我认为 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 %) 是唯一需要更改的。

关于datetime - Clojure 日期时间算术与#inst's,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54320581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com