请分享您的想法,参加 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
 
最佳答案

Slack上由 @cddr 提供的答案

请在 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 进行任何更改。

...