当前位置: 首页 > 知识库问答 >
问题:

LocalDateTime将无效日期解析为有效日期,并且不引发任何异常

陈君之
2023-03-14

我在Spring API的请求体中使用LocalDateTime。

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-mm-dd HH:mm:ss")
  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  @JsonSerialize(using = LocalDateTimeSerializer.class)
  private LocalDateTime createdAt;

当我在请求中输入无效日期时,例如“2020-02-31 00:00:00”,它会自动转换为“2020-02-29 00:00:00”。我想在无效日期的情况下抛出异常。官方留档中提到它会转换为以前的有效日期。

 In some cases, changing the specified field can cause the resulting date-time to become invalid,
 such as changing the month from 31st January to February would make the day-of-month invalid.
 In cases like this, the field is responsible for resolving the date.
 Typically it will choose the previous valid date, 
 which would be the last valid day of February in this example.

共有1个答案

桓修能
2023-03-14

您需要为此编写一个自定义的序列化程序。

class CustomLocalDateTimeSerializer extends StdSerializer<LocalDateTime> {
    private static final DateTimeFormatter FORMATTER
            = DateTimeFormatter.ofPattern("yyyy-mm-dd HH:mm:ss");

    ...

    @Override
    public void serialize(LocalDateTime value, JsonGenerator generator, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        // Do your validation using FORMATTER.
        // Serialize the value using generator and provider.
    }
}

然后,您可以在注释中使用它。

@JsonSerialize(using = CustomLocalDateTimeSerializer.class)

请注意,DateTimeFormatter格式化/解析无效值时引发异常。

查看LocalDateTimeSerializer的源代码以了解必须执行的操作。查看Jackson Date-10。序列化Java8 Date而无需任何额外依赖,以获取编写自定义序列化程序的示例。这类似于自定义反序列化程序。

 类似资料:
  • 问题内容: 我想在客户端验证日期,因此编写了以下代码。但是我没有得到异常,而是得到了2月31日日期字符串的正确日期对象,这显然是无效的日期。 输出 :2015-02-28T11:30:59 有谁知道为什么要解析这个日期而不是抛出异常。 问题答案: 您只需要严格。 解析文本字符串分为两个阶段。阶段1是根据添加到构建器中的字段进行的基本文本解析。阶段2将解析的字段值对解析为日期和/或时间对象。此样式用

  • 这是我到目前为止用于此任务的代码: 但是如果我输入了一个无效的日期,比如,它将转换为,而不是抛出异常。

  • 问题内容: 我正在针对从Excel文件导入的数据运行SQL语句。在此SQL中,我正在检查用户是否已使用IsDate函数正确输入了日期。由于这是尚未转换的原始数据,因此所有日期都存储在varchar数据类型字段中。 在某些情况下,如果用户输入的日期格式明显不正确,IsDate将返回1(有效日期)。 例如: 关于如何处理此问题的任何建议? 谢谢! ps Smacking用户没有帮助。 问题答案: 我做

  • 我有两个日期,都是有效的ISO-8601格式,我正在尝试将它们转换为日期对象。 为什么JavaScript无法将第二个日期识别为有效的ISO-8601格式? 如何以这种格式创建Date对象?

  • 我正在尝试将存储在mongoDb中的Javascript日期转换为Java LocalDateTime ISO\u Date\u TIME,并且我一直遇到ParseException,我不知道为什么我的代码会出错。首先,代码: 解析器: 传递的日期格式为“2021 10月7日星期四21:29:36 GMT 0000(协调世界时)” 我收到的错误是: getUserById()中的异常,原因='ja

  • 问题内容: 我需要解析一个字段,有时将其指定为日期,有时将其指定为日期/时间。使用Java 8时间API是否可以为此使用单个数据类型?目前,我尝试为其使用LocalDateTime,但是对于以下调用, 我得到了 这是某些接受日期/日期时间解析模式作为配置选项的通用解析器的一部分。因此,例如下面的解决方案具有硬编码的解析模式 对我来说不是一个选择。 任何其他建议以干净的方式进行编码都是值得欢迎的。