2024 年 Clojure 状态调查 中分享您的想法!

欢迎!请查阅 关于 页面以获取更多有关如何使用本网站的信息。

+2
打印
关闭

更新

https://clojure.org/news/2024/05/23/clojure-1-12-alpha12

Alpha12 撤销了导致此问题的更改。因此,此次讨论已过时。


我刚刚注意到 Clojure 1.12 alpha10 改变了创建旧 #inst 日期的方式。据我所知,Java 试图在引入格里高利历之前调整旧日期。

在 Clojure 1.11.3 中

user-> #inst "1582-02-24"
#inst "1582-02-24T00:00:00.000-00:00"

在 Clojure 1.12-alpha10 中

user=> #inst "1582-02-24"
#inst "1582-03-06T00:00:00.000-00:00"

我发现这个问题是在对一个测试日期的老项目进行一些生成性测试时发现的。我将更改测试,只考虑这个千年,这对我来说没问题。我认为 Clojure 并不必为此更改做任何事情。我只是认为,如果其他人遇到这个问题,这值得一提。

更新到 Clojure 1.12 alpha 11

user=> (use 'clojure.instant)
nil
user=> (read-instant-date "1582-02-24")
#inst "1582-03-06T00:00:00.000-00:00"
user=> (read-instant-calendar "1582-02-24")
#inst "1582-02-24T00:00:00.000+00:00"
user=> (read-instant-timestamp "1582-02-24")
#inst "1582-03-06T00:00:00.000000000-00:00"
已关闭,备注为:撤销了原始更改,将考虑稍后同时更改解析器和格式化器
我在学习一点从儒略历到格里高利历过渡的历史,以及如何在现代 Java 中处理拟历历的日期。我开始认为 #inst 应该完全避免拟历历日期,但我觉得其他人可能会有更深入的意见。以下是一些有用的 StackOverflow 问题

https://stackoverflow.com/questions/23975205/why-does-converting-java-dates-before-1582-to-localdate-with-instant-give-a-diff

https://stackoverflow.com/questions/23457470/calendar-to-date-conversion-for-dates-before-15-oct-1582-gregorian-to-julian-ca
by
我认为正确的做法是重新实现大多数 instant.clj 使用 java.time.Instant 作为基础。这在我看来解决了问题。

1 答案

0 投票
by
编辑 by

请忽略以下内容 - 我直接使用 clojure.instant/read-instant-date 测试了它,看来这不是在普通的 REPL 中使用 #inst 的结束方式。


这与 Java 没有关系,因为更改 Clojure 的版本本身不会改变你使用的 Java 版本。

一个快速实验表明,两个版本以相同的方式解析日期 - 对 (.getTime ...) 的调用返回相同的 -12238560000000

所以这似乎是不同之处在于实例的输出方式。提交 213c50e7 通过切换到不同的打印方法解决了 CLJ-2803

通过使用 1.12.0-alpha10 中的旧打印方法,我们可以确认猜测。

(let [fmt (java.text.SimpleDateFormat. "yyyy-MM-dd'T'HH:mm:ss.SSS-00:00")]
  (.setTimeZone fmt (java.util.TimeZone/getTimeZone "GMT"))
  (.format fmt d))
=> "1582-02-24T00:00:00.000-00:00"
by
如何快速让自己发疯而又不影响任何人

    user=> (.getTime #inst "1582-02-24")
    -12237696000000
    user=> (let [d #inst "1582-02-24"] (.getTime d))
    -12237696000000
    user=> (def d #inst "1582-02-24")
    #'user/d
    user=> (.getTime d)
    -12238560000000  ;;; What the hell?
...