1

Java.util.date 包是自动更正日期。例如:如果我们将日期传递为“2018-02-35”,它会自动将其更改为“2018-03-07”,这是一个有效日期。

基本上,要求是验证用户输入的日期,但随着日期自动更正,模块永远无法找到不正确的日期。(注意:由于某些特殊限制,无法进行 UI 验证,因此必须由中间件系统进行验证)。

有没有办法我可以使用相同的 util 包来处理这个问题,或者可以通过任何 3rd 方 jar 来处理这个问题?请给个建议

4

2 回答 2

0

即使我面临同样的问题。但是经过一些研究,我发现 DateFormat 类中有一个方法 (setLenient()) 可以禁用此行为。

DateFormat df = new SimpleDateFormat(DATE_FORMAT);
df.setLenient(false);

Java Docs:指定日期/时间解析是否宽松。通过宽松的解析,解析器可以使用启发式方法来解释不精确匹配该对象格式的输入。使用严格的解析,输入必须匹配这个对象的格式。

于 2018-07-17T10:08:14.007 回答
0

你可以写 DateDeserializer

public class DateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", getLocale());
        format.setLenient(false); // if true, will auto correct the date  
                                  // to the next possible valid date
        String date = jp.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    private Locale getLocale() {
        Locale locale = (LocaleContextHolder.getLocale() != null) ? LocaleContextHolder.getLocale() : Locale.getDefault();
        return locale;
    }

}

然后使用此 DateDeserializer 在媒体类中注释您的日期属性。您还可以使用 dateSerializer 将对象序列化回 Json 格式。下面的例子

@JsonSerialize(using=DateSerializer.class)
@JsonDeserialize(using=DateDeserializer.class)
private Date startDate;
于 2018-07-18T06:00:46.150 回答