杰克逊@JsonFormat意外的时区输出

时间:2017-03-31 16:06:02

标签: java json date jackson

我有这个POJO:

@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和jackson 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时区,没有冒号。我错过了一个选项吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

但是,我不确定你是否应该受到打扰。只要符合标准的日期格式,在您的情况下为ISO8601,任何理智的解析器都能够以任何语言提取它。