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

欢迎!有关如何使用此网站的更多信息,请参阅关于页面。

0
data.json
已关闭

有关完整的背景信息,请在此查看Slack讨论:https://clojurians.slack.com/archives/C03S1KBA2/p1723222018579489

问题陈述

我有一个:date-format"MMMM, dd yyyy HH:mm:ss Z",我使用Cheshire将其转换为JSON日期/时间值。特别是java.sql.Timestamp,但也包括其他类型。这工作。

我想切换到data.json,所以我为:date-formatter提供了(DateTimeFormatter/ofPattern "MMMM, dd yyyy HH:mm:ss Z"),但是它抛出了一个异常,因为在内部,data.json将日期/时间值强制转换为java.time.Instant,它不支持该模式。

我考虑的一些可能解决方案

  • 强制用户手动转换那些类型(这正是违反对DJSON-41的解决方案的初衷)-- 这本质上是不采取任何行动
  • 提供一个选项,在格式化之前将Instant预转换到其他类型(这给了用户对时区和偏移等的控制权)
  • 让现有的:date-formatter选项更智能,以便它可以接受一个DateTimeFormatter 或用户提供的Instant格式化函数
  • 在内部将Instant更改为其他日期/时间类型,以与Instant已支持的所有格式兼容,以便允许更多的DateTimeFormatter模式
  • ...

我通过使用:value-fn来解决这个问题,但这意味着对每个值进行运行时测试,并在用户代码中将日期/时间值手动转换为字符串...

  • 1违背了添加日期/时间格式化支持的全部初衷
  • 2和3都会增加一些运行时开销(选项3可能是我的首选)
  • 4可能很难完全支持所有现有的格式(我不知道),但可能是最具“Cheshire兼容性”的路径
已关闭,备注为:由@cddr在Slack上解决,并在下面添加了答案供将来搜索者使用。

1 个答案

0
 
最佳答案

由@cddr在Slack上提供的答案

直接在DateTimeFormatter上使用.withZone来提供时区,然后与clojure.data.json配合使用,原始格式仍然正常工作。

{:date-formatter (-> (DateTimeFormatter/ofPattern "MMMM, dd yyyy HH:mm:ss Z")
                     (DateTimeFormatter/.withZone ZoneOffset/UTC))}

(或(ZoneId/systemDefault)等类似选项)。

这完全解决了问题,无需对clojure.data.json进行更改。

...