【问题标题】:Serialize and deserialize a Instant as `yyyy-MM-dd`将 Instant 序列化和反序列化为 `yyyy-MM-dd`
【发布时间】:2021-12-02 02:31:49
【问题描述】:

我有一个这样的 POST API:

    @JsonDeserialize(using = MyCustomDeserializer.class)
    @JsonSerialize(using = MyCustomSerializer.class)
    @NotNull(message = "fromDate should not be blank!")
    @FutureOrPresent(message = "fromDate must be of Future or Present")
    private Instant fromDate;

我的实用程序包中有自定义序列化器和反序列化器:

public class MyCustomSerializer extends JsonSerializer<Instant> {
    private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC);

    @Override
    public void serialize(Instant value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        String str = fmt.format(value);

        gen.writeString(str);
    }
}
public class MyCustomDeserializer extends JsonDeserializer<Instant> {

    private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC);

    @Override
    public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        LocalDate date = LocalDate.parse(p.getText());
        return Instant.from(fmt.parse(date.toString()));
    }
}

我想在内部保存时间组件作为一天的开始。 API 应仅由date 接收和输出

我尝试将this 转换为Instant。有人可以帮助我如何做到这一点(在数据库中存储为 date+start_of_day)并以 yyyy-MM-dd 公开/使用?

【问题讨论】:

    标签: java spring-boot datetime java-8 datetime-format


    【解决方案1】:

    TL;DR

        return date.atStartOfDay(ZoneOffset.UTC).toInstant();
    

    (未测试,如有错别字请见谅。)

    详情

    您实际上是在尝试将方形钉子装入圆孔中。 Instant 是一个时间点,在那个时间点,它是不同时区的两个或三个不同的日期。适应 UTC 会有所帮助,然后我们就可以让它发挥作用。它仍然不理想。差异的标准解决方案(hack)是在某个时区将日期表示为一天的开始,而 UTC 是一个很好的选择。

    为什么你的代码不起作用

    在反序列化器中解析日期(格式化后)会给出日期和 UTC 偏移量,但没有时间。我们需要三者共同建立一个明确的时间点。相反,在我的代码中,我明确指定了一天的开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多