【问题标题】:SpringBoot deserializing json instant to next daySpring Boot 将 json 反序列化到第二天
【发布时间】:2021-12-12 13:09:15
【问题描述】:

所以我观察到@FutureOrPresent 也在抱怨当前日期。进一步调试我的代码

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

    @Override
    public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        LocalDate date = LocalDate.parse(p.getText(), fmt);
        Instant instant = date.atStartOfDay(ZoneId.of("UTC")).toInstant();
        return instant;
    }
}

调试给了我这个状态:

知道如何解决这个问题吗?如果有帮助,我在亚洲/加尔各答区

如果我在 JSON 文件中以 fromDate 传递当前日期,则会收到此错误:

fromDate Must Be Of Future Or Present

POJO 有这种格式

@JsonDeserialize(using = MyCustomDeserializer.class)
    @JsonSerialize(using = MyCustomSerializer.class)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    @NotNull(message = "Please provide From Date")
    @FutureOrPresent(message = "From Date Must Be Of Future Or Present")
    private Instant fromDate;

【问题讨论】:

  • 到底是什么问题? Instant 的值是否不等于任何(未知)预期值?你能更详细地描述这个问题吗?如果你在ZoneId.of("Asia/Kolkata"),那你为什么要使用ZoneId.of("UTC")从一个日期开始创建一个Instant
  • @deHaar 对于以fromDate 作为当前日期的有效负载,当前日期存在错误警报。即使是27-10-2021 也被验证器抓住了,尽管它是当前日期
  • 瞬间就是时间的瞬间。如果你从今天开始,那是过去,而不是未来或现在。
  • 确实,您正在检查日期和时间到最小的可计算单位,而不是仅仅检查您明显得到的日期部分。如果您使用今天的日期,atStartOfDay() 将在 Instant.now() 之前。
  • 使用LocalDate而不是Instant,如果您想比较日期(包括年、年月和月日)会更合适。

标签: java spring-boot datetime jackson


【解决方案1】:

问题是您使用的是一天的开始时间

如果您使用今天的日期,那将永远是过去。 如果您今天使用并想要一个未来的瞬间,您可以在一天结束时获得一个瞬间

LocalDateTime localDateTime= date.atTime(23, 59, 59); 
localDateTime.atZone( ZoneId.of("UTC")); 
localDateTime.toInstant();

这将为您提供一个最有可能是今天但也总是在未来或最有可能现在的瞬间

您也可以使用未来一分钟的瞬间,而不是一天结束时。

当前时间的瞬间可能会失败,因为请求需要时间才能到达目的地,而且有一点缓冲也不错

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2016-12-31
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多