首页 > 解决方案 > 有没有办法将所有日期序列化和反序列化为 UTC 毫秒?

问题描述

我正在尝试在我们的应用程序中标准化日期,以在请求和响应中发送 UTC 毫秒。

该应用程序使用 Spring Boot 作为 REST 后端。我已经添加BasicStringTypeAdapters了 for java.util.Datejava.time.LocalDateTimejava.time.Instant,如下所示,但没有一个被应用。

如果我为 添加一个虚拟的java.lang.String,它可以工作,所以我知道这些是在适当的地方注册的。

但是,我相信这里的代码是无条件地覆盖这些适配器。具体registerJsonTypeAdapters(Java8TypeAdapters.adapters());覆盖java.time.LocalDateTimejava.time.Instant(我相信)gsonBuilder.serializeNulls().setDateFormat(ISO_DATE_TIME_FORMAT);覆盖java.util.Date

如果我不正确,有人可以指出我如何将所有日期序列化为 UTC 毫秒的正确方向吗?

如果我是正确的,我还能得到一些关于如何进行的建议吗?

return TransactionalJaversBuilder
        .javers()
        .withTxManager(transactionManager)
        .withObjectAccessHook(new HibernateUnproxyObjectAccessHook())
        .registerJaversRepository(sqlRepository)
        .registerValueTypeAdapter(
            new BasicStringTypeAdapter<Date>() {
              @Override
              public Class getValueType() {
                return Date.class;
              }

              @Override
              public String serialize(Date value) {
                return String.valueOf(value.getTime());
              }

              @Override
              public Date deserialize(String in) {
                return new Date(Long.valueOf(in));
              }
            }
        )
        .registerValueTypeAdapter(
            new BasicStringTypeAdapter<LocalDateTime>() {
              @Override
              public Class getValueType() {
                return LocalDateTime.class;
              }

              @Override
              public String serialize(LocalDateTime value) {
                return String.valueOf(value.toInstant(ZoneOffset.UTC).toEpochMilli());
              }

              @Override
              public LocalDateTime deserialize(String in) {
                return Instant.ofEpochMilli(Long.valueOf(in)).atZone(ZoneOffset.UTC).toLocalDateTime();
              }
            }
        )
        .registerValueTypeAdapter(
            new BasicStringTypeAdapter<Instant>() {
              @Override
              public Class getValueType() {
                return Instant.class;
              }

              @Override
              public String serialize(Instant value) {
                return String.valueOf(value.toEpochMilli());
              }

              @Override
              public Instant deserialize(String in) {
                return Instant.ofEpochMilli(Long.valueOf(in));
              }
            }
        )
        .build();

标签: javaspring-bootjavers

解决方案


推荐阅读