将当前时区设置为@JsonFormat时区值

11
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = "Asia/Kolkata")
private Date activationDate;

从以上Java代码中,我想要设置时区值为当前系统时区,使用以下代码: TimeZone.getDefault().getID() -它返回值为"亚洲/加尔各答"

但如果我将此代码设置为JSON格式

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = TimeZone.getDefault().getID())

我遇到了一个错误,类似于“注解属性JsonFormat.timezone的值必须是常量表达式”

请帮我解决这个问题。

提前致谢, Vishnu


我认为你必须为这个任务定义一个反序列化器,但我还没有尝试过。我也处于这样的情况。如果你有什么东西,请在下面附上你的解决方案,谢谢。 - WesternGun
你解决了这个问题吗?如果是,请更新。 - Vikas
3个回答

15
你可以在正确配置ObjectMapper之后使用 JsonFormat.DEFAULT_TIMEZONE
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = JsonFormat.DEFAULT_TIMEZONE)

从文档中得知:

该值指示应使用默认时区(从反序列化或序列化上下文):注释不定义要使用的值。

注意:这里的默认值并不是指JVM的默认值,而是Jackson数据绑定的默认值,通常为UTC,但可能在ObjectMapper上进行更改。

为了配置ObjectMapper

@Configuration
public class MyApp {

    @Autowired
    public void configureJackson(ObjectMapper objectMapper) {
        objectMapper.setTimeZone(TimeZone.getDefault());
    }
}

要在您的应用程序中设置默认的TimeZone,请使用此JVM属性:

-Duser.timezone=Asia/Kolkata

4
不完全正确。请参见 https://dev59.com/K7Lma4cB1Zd3GeqPdp0j#55225726。 - 8t12c7081
1
看起来像是javadoc有点误导性 https://github.com/FasterXML/jackson-databind/issues/1266 - simar
大家好,感谢指出不准确之处,我已经更新了答案。Jackson也更新了他们的Javadocs。 - xonya

7

您不能将时区的值分配为动态或运行时值。它应该是一个常量或编译时值,并且也接受枚举

因此,您应该分配一个常量给时区。如下所示。

private static final String MY_TIME_ZONE="Asia/Kolkata";
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = MY_TIME_ZONE);

1
你好,Raju Sharma, 我想将时间区设置为系统当前的时区,不需要分配类似于“亚洲/加尔各答”这样的常量值。 - Vishnu Moorthy Kanagaraj
我不明白为什么默认是使用UTC而不是当前系统时间戳?另外,为什么不能序列化为它所持有的值?这很奇怪。 - undefined

-1

您可以使用枚举来可能丰富您要使用的时区。使用枚举的解决方案是以下枚举类实现。

    package <your package goes here>;

    import java.util.TimeZone;


    public enum TimeZoneEnum {

        DEFAULT(TimeZone.getDefault()),
        ASIA_KOLKATA = (TimeZone.getTimeZone("Africa/Abidjan")),
        //other timezones you maybe need
        ...


    private final TimeZone tz;

        private TimeZoneEnum(final TimeZone tz)
        {
            this.tz = tz;
        }

        public final TimeZone getTimeZone()
        {
            return tz;
        }
    }

然后你可以像下面这样使用枚举:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = TimeZoneEnum.ASIA_KOLKATA )

1
谢谢,使用上述代码后,我仍然收到相同的错误提示:“注释属性JsonFormat.timezone的值必须是常量表达式”。 - Vishnu Moorthy Kanagaraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接