2017-03-31 23 views
1

我有这样的POJO:杰克逊@JsonFormat意想不到的时区输出

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Scheduling { 

    @JsonProperty("created_at") 
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") 
    public Date creationDate; 

} 

用java 8和杰克逊2.7.8,我序列化通过:

String s = new ObjectMapper().writeValueAsString(scheduling); 
System.out.println(s); 

我期望的输出像官方SimpleDateFormat的文档:{"created_at":"2001-07-04T12:08:56.235-07:00"},但我得到的是Z时区:{"created_at":"2017-03-31T15:42:44.923Z"}。我试过X,XX和XXX,每个都显示一个Z时区。然而,yyyy-MM-dd'T'HH:mm:ss.SSSZ确实会按预期显示+0000时区,不含冒号。我错过了一个选项吗?

+0

我明白你的输出,但是你作为一个输出你真正期待什么? +0000而不是Z? –

+0

我希望看到像'2001-07-04T12:08:56.235 + 00:00' – yenox

回答

2

你需要敏锐的眼光来阅读那部分文档:)。

简而言之,模式中的“Z”表示RFC822时区偏移量。它总是'Sign TwoDigitHours Minutes'。但是,X(或多个X)代表ISO8601指示符,可以是任何众所周知的组合,包括小时,分钟和时区字母符号,包括'Z'(ulu)。实际上,如果提供GMT + 0时间,它倾向于将其序列化为'Z'而不是+00:00。我不知道这可以改变。此外,请注意,使用'Z'作为时区格式的格式化程序将而不是解析字母时区标志符。

这里更多:https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html#rfc822timezone

但是,我不知道,你应该被人打扰。只要符合标准的日期格式(在您的情况下为ISO8601),任何理智的解析器都将能够以任何语言提取它。

+0

感谢这些细节,我实际上得出了相同的结论,即Z不能被+00:00替代。但正如你所说,我想它会做。 – yenox