请在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/23457470calendar-to-date-conversion-for-dates-before-15-oct-1582-gregorian-to-julian-ca
我认为正确的方法是将instant.clj的大部分重新实现,以使用java.time.Instant作为基础。这对我似乎是解决问题的方法。

1 个答案

0

请忽略以下内容——我直接使用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  ;; 什么鬼?
...