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/1582年10月15日之前的日期如何从日历转换为日期-格里高利历到儒略历的转换
我认为正确的做法是重新实现 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"
如何迅速失去理智而不打扰任何人

    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  ;; 什么鬼?
...