Java/Kotlin:为什么Jackson解析日期与SimpleDataFormat不同?

Java/Kotlin:为什么Jackson解析日期与SimpleDataFormat不同?,java,jackson,kotlin,simpledateformat,Java,Jackson,Kotlin,Simpledateformat,我敢肯定这是某种形式的用户错误,但我不知道我做错了什么 我有一个Kotlin数据类,其构造函数字段如下: data class CronEvent( @JsonFormat( shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'" ) @JsonProperty("time") val time: Date ) 这由接受json字

我敢肯定这是某种形式的用户错误,但我不知道我做错了什么

我有一个Kotlin数据类,其构造函数字段如下:

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。您可以使用注释的
时区
属性进行覆盖


SimpleDateFormat
的默认时区是本地时区(
MST
,从输出读取)

确保时区匹配。您可以添加以下行:

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
就在您的
SimpleDataFormat
的构造下方


虽然文本格式的日期包含时区(末尾的
Z
,意思是
UTC
),但您使用的格式只是将Z视为文字字符,而不是将其解释为时区。

您也可以粘贴json文件吗?这是一个时区问题
2018-01-15T00:48:43Z
表示0:48:43 UTC,但被解析为0:48:43 MST。我认为您不应该为早已过时且臭名昭著的
SimpledTeFormat
类和同样过时的
Date
而烦恼。我自己没有在Jackson中使用现代Java日期和时间API的经验,但这是可能的。例如,见。在堆栈溢出上搜索更多信息。
Z
表示zulu时区或UTC的偏移量为零。您应该这样解析它
Instant.parse()
将在没有显式格式化程序的情况下正确执行此操作
Instant
是来自
java.time
AKA JSR-310的类,您应该使用它来代替
Date
。啊,我明白了。这是有道理的。我担心这可能是问题所在,因为在同一个庄园解析UTC日期的所有示例都像T一样避开了Z。似乎没有提供现成的解决方案来解析
Z
作为时区,因此这是目前最好的选择。Thanks@PaulNelsonBaker
java.time.Instant.parse(“2018-01-15T00:48:43Z”)