@JsonFormat DEFAULT_TIMEZONE似乎不起作用

时间:2019-03-18 14:58:15

标签: java serialization jackson

我在将日期逻辑隔离到JSON序列化器Jackson时遇到了一些问题。

在数据库和应用程序的调试点中,日期正确,并且所有内容均使用默认时区编写。但是,在序列化中要添加4个小时。我发现可以通过告诉杰克逊专门使用EST(默认为UTC)来补救。如下:

@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss.SSSZ", timezone="America/New_York")
private Date startDate;

但是,问题是只有本地使用EST,而服务器将使用UTC。我需要Jackson使用系统默认设置。

幸运的是,我发现this similar question得到了the documentation的支持。新解决方案:

@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss.SSSZ", timezone=JsonFormat.DEFAULT_TIMEZONE)
private Date startDate;

但是,它不起作用!我还尝试了timezone='DEFAULT_TIMEZONE'和其他各种方法,但在所有情况下,api输出似乎仍比数据库中的数字早4小时。

我尝试过的其他事情:

  • 注销JsonFormat.DEFAULT_TIMEZONE会返回##default
  • 登录TimeZone.getDefault().getDisplayName()返回Eastern Standard Time

Jackson版本是2.9。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

解决了我自己的问题。这是我发现的:

$("#nav li").click(function(){ $("a").toggleClass("active"); }); 不是系统默认值,正如documentationSO answer建议的那样,但实际上默认为UTC。

org.springframework.http.converter.json.Jackson2ObjectMapperBuilder

JsonFormat.DEFAULT_TIMEZONE

com.fasterxml.jackson.annotation.JsonFormat

/**
 * Override the default {@link TimeZone} to use for formatting.
 * Default value used is UTC (NOT local timezone).
 * @since 4.1.5
 */
public Jackson2ObjectMapperBuilder timeZone(TimeZone timeZone) {

解决方案

/**
 * Value that indicates that default {@link java.util.TimeZone}
 * (from deserialization or serialization context) should be used:
 * annotation does not define value to use.
 *<p>
 * NOTE: default here does NOT mean JVM defaults but Jackson databindings
 * default, usually UTC, but may be changed on <code>ObjectMapper</code>.
 */
public final static String DEFAULT_TIMEZONE = "##default";

@Autowired com.fasterxml.jackson.databind.ObjectMapper objectMapper;

这应该将Jackson ObjectMapper设置为使用系统默认值而不是Jackson默认值(UTC)。