Java/Kotlin:为什么 Jackson 解析日期的方式与 SimpleDateFormat 不同?
Java/Kotlin: Why does Jackson parse dates differently from SimpleDateFormat?
我确定这是某种形式的用户错误,但我无法弄清楚我做错了什么。
我有一个 Kotlin 数据 class,它的构造函数字段如下:
data class CronEvent(
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'"
)
@JsonProperty("time")
val time: Date
)
这由接受 json 字符串作为有效负载的 ObjectMapper 填充。对于我的单元测试,我有一个使用相同模式实例化的 SimpleDateFormat
对象。
val jsonStream = CronEventTests::class.java.classLoader.getResourceAsStream("CronEventPayload.json")
val cronEvent = jsonStreamToCronEvent(jsonStream)
// ...
val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
val expectedDate = simpleDateFormat.parse("2018-01-15T00:48:43Z")
cronEvent.time shouldBe expectedDate
我在单元测试中加载的 json 文件 (CronEventPayload.json
) 具有完全相同的日期字符串 (2018-01-15T00:48:43Z
) 但我的测试失败了。
java.lang.AssertionError: expected: Mon Jan 15 00:48:43 MST 2018 but was: Sun Jan 14 17:48:43 MST 2018
Expected :Mon Jan 15 00:48:43 MST 2018
Actual :Sun Jan 14 17:48:43 MST 2018
它们具有相同的输入并使用相同的日期格式字符串,但它们明显不同。为什么这两个日期不一样?
@JsonFormat
的默认时区是 UTC
。您可以使用注释的 timezone
属性覆盖。
SimpleDateFormat
的默认时区是您当地的时区(MST
,从您的输出中读取)
确保时区匹配。您可以添加行:
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
就在您 SimpleDateFormat
的构造下面。
尽管文本格式的日期包含时区(末尾的 Z
,意思是 UTC
),但您使用的格式只是将 Z 视为文字字符,您没有将其解释为时区。
我确定这是某种形式的用户错误,但我无法弄清楚我做错了什么。
我有一个 Kotlin 数据 class,它的构造函数字段如下:
data class CronEvent(
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'"
)
@JsonProperty("time")
val time: Date
)
这由接受 json 字符串作为有效负载的 ObjectMapper 填充。对于我的单元测试,我有一个使用相同模式实例化的 SimpleDateFormat
对象。
val jsonStream = CronEventTests::class.java.classLoader.getResourceAsStream("CronEventPayload.json")
val cronEvent = jsonStreamToCronEvent(jsonStream)
// ...
val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
val expectedDate = simpleDateFormat.parse("2018-01-15T00:48:43Z")
cronEvent.time shouldBe expectedDate
我在单元测试中加载的 json 文件 (CronEventPayload.json
) 具有完全相同的日期字符串 (2018-01-15T00:48:43Z
) 但我的测试失败了。
java.lang.AssertionError: expected: Mon Jan 15 00:48:43 MST 2018 but was: Sun Jan 14 17:48:43 MST 2018
Expected :Mon Jan 15 00:48:43 MST 2018
Actual :Sun Jan 14 17:48:43 MST 2018
它们具有相同的输入并使用相同的日期格式字符串,但它们明显不同。为什么这两个日期不一样?
@JsonFormat
的默认时区是 UTC
。您可以使用注释的 timezone
属性覆盖。
SimpleDateFormat
的默认时区是您当地的时区(MST
,从您的输出中读取)
确保时区匹配。您可以添加行:
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
就在您 SimpleDateFormat
的构造下面。
尽管文本格式的日期包含时区(末尾的 Z
,意思是 UTC
),但您使用的格式只是将 Z 视为文字字符,您没有将其解释为时区。