【发布时间】:2019-06-19 10:08:53
【问题描述】:
我们有一个用于生成报告的库。它从数据文件(SQL、XML、JSON 等)中读取数据,然后可以在用户编写的公式中修改日期时间,然后按照报告输出指定的格式对其进行格式化。
方程中的用法可以是添加时间跨度,获取部分值,如“if date.month == 2”,以及几乎all the datetime macros in Excel。
因为数据可以是 JSON(或没有架构的 XML),所以日期时间可以是“2019-01-25”、“2019-01-25T14:32:23”、“2019-01-25T14:32:23.12345” "、"2019-01-25T14:32:23Z" 或 "2019-01-25T14:32:23Z-0500"(最后两个也可以有 ".12345")。
如果没有时区偏移,我们假设日期时间为 UTC。虽然这应该是真的,但通常不是,它是当地时间,但它的使用方式并不重要。因此,除非指定时区偏移量,否则将其设为 UTC 是可行的(到目前为止,我们一直使用 Date)。
第一个问题 - 我应该使用什么类来保存这个值?根据我的阅读,我认为 ZonedDateTime,但也许是 Instant?
第二个问题 - 当我必须执行诸如将日期时间增加 3 天之类的操作时,我应该使用什么类来表示时间跨度?
第三个问题 - 是否有一些解析器可以解析我上面列出的所有不同字符串?还是我需要调用 String.contains() 来确定格式,然后根据它做一个明确的模式?如果是这样,使用什么类?
【问题讨论】:
-
您的示例中没有时区,只有时区偏移量,因此
OffsetDateTime比ZonedDateTime更有意义。 -
你考虑过Joda Time吗?这是我最喜欢的时间工作课程。如果你能实现它,如果你愿意,我可以回答它。
-
@S.Czop 我们使用的是 Java 1.8,所以我们将使用 java.time。
-
@S.Czop 为什么要将外部库用于标准运行时中现已涵盖的内容(除非您必须使用 Java 7)。
-
回复。你的第一个问题。看看你的最后一个例子
2019-01-25T14:32:23Z-0500:你需要知道 5hrs 的偏移量吗?或者您是否可以只在 UTC 中保持相同的时刻,即2019-01-25T19:32:23Z?或者您更喜欢2019-01-25T14:32:23Z(不是同一时刻,而是同一本地时间)?
标签: java java-time zoneddatetime java.time.instant