Java Jsonb 反序列化 ISO8601 中的 UTC 日期时间
Java Jsonb deserializing UTC datetime in ISO8601
我正在使用 JSON-B(yasson 实现)并且我正在接收具有这样一个字段的对象的数据
{
...
"timestamp": "2020-03-19T06:42:42Z",
...
}
对于 UTC 日期时间值,这是完美的标准 ISO 8601。现在对应的Javaclass只是声明了一个Date成员变量,没有其他具体的注解
...
private Date timestamp;
...
一切似乎都工作正常,看起来 JSON-B 实现正确理解了 UTC,而我不必使用 @JsonbDateFormat注解。我想我很确定,因为我用
检查过
ZonedDateTime datetimeCheck = ZonedDateTime.of(2020, 3, 19, 6, 42, 42, 0, ZoneId.of("UTC"));
Date parsedDateFromJson = myModel.getTimestamp();
boolean compareTs = parsedDateFromJson.equals(Date.from(datetimeCheck.toInstant()));
并且它产生 true 但是,当我 运行 另一个测试从日期时间值中删除 'Z' 我期望它产生一个将日期时间值解释为本地而不是 UTC 的不同结果。令我大吃一惊的是,JSON-B 得到的 Date 对象完全一样。
我在这里错过了什么?为什么 2020-03-19T06:42:42Z 和 2020-03-19T06:42:42 是一回事? (我不认为他们是)。或者也许 JSON-B 实现在未指定时区时始终将 UTC 视为默认值?
谢谢
Or maybe is the JSON-B implementation considering UTC as default always when no timezone is specified?
正是这样。与其名称所暗示的相反,java.util.Date
实际上并不代表日期,而是代表一个瞬间。具体来说,它表示自 UNIX 纪元(1970 年 1 月 1 日,00:00:00 GMT)以来的毫秒数。
2020-03-19T06:42:42
是没有时区或偏移量信息的日期+时间。将此日期 + 时间反序列化为 java.util.Date
,即瞬间,您需要决定如何解释日期 + 时间。这是UTC的日期+时间吗?这是您当地时区的日期和时间吗?
幸运的是,JSON-B 规范包含以下内容:"If not specified otherwise in this section, GMT standard time zone and offset specified from UTC Greenwich is used."没有时区的日期 + 时间作为 UTC 的日期 + 时间。
我正在使用 JSON-B(yasson 实现)并且我正在接收具有这样一个字段的对象的数据
{
...
"timestamp": "2020-03-19T06:42:42Z",
...
}
对于 UTC 日期时间值,这是完美的标准 ISO 8601。现在对应的Javaclass只是声明了一个Date成员变量,没有其他具体的注解
...
private Date timestamp;
...
一切似乎都工作正常,看起来 JSON-B 实现正确理解了 UTC,而我不必使用 @JsonbDateFormat注解。我想我很确定,因为我用
检查过ZonedDateTime datetimeCheck = ZonedDateTime.of(2020, 3, 19, 6, 42, 42, 0, ZoneId.of("UTC"));
Date parsedDateFromJson = myModel.getTimestamp();
boolean compareTs = parsedDateFromJson.equals(Date.from(datetimeCheck.toInstant()));
并且它产生 true 但是,当我 运行 另一个测试从日期时间值中删除 'Z' 我期望它产生一个将日期时间值解释为本地而不是 UTC 的不同结果。令我大吃一惊的是,JSON-B 得到的 Date 对象完全一样。 我在这里错过了什么?为什么 2020-03-19T06:42:42Z 和 2020-03-19T06:42:42 是一回事? (我不认为他们是)。或者也许 JSON-B 实现在未指定时区时始终将 UTC 视为默认值?
谢谢
Or maybe is the JSON-B implementation considering UTC as default always when no timezone is specified?
正是这样。与其名称所暗示的相反,java.util.Date
实际上并不代表日期,而是代表一个瞬间。具体来说,它表示自 UNIX 纪元(1970 年 1 月 1 日,00:00:00 GMT)以来的毫秒数。
2020-03-19T06:42:42
是没有时区或偏移量信息的日期+时间。将此日期 + 时间反序列化为 java.util.Date
,即瞬间,您需要决定如何解释日期 + 时间。这是UTC的日期+时间吗?这是您当地时区的日期和时间吗?
幸运的是,JSON-B 规范包含以下内容:"If not specified otherwise in this section, GMT standard time zone and offset specified from UTC Greenwich is used."没有时区的日期 + 时间作为 UTC 的日期 + 时间。