Java.util.date 包是自动更正日期。例如:如果我们将日期传递为“2018-02-35”,它会自动将其更改为“2018-03-07”,这是一个有效日期。
基本上,要求是验证用户输入的日期,但随着日期自动更正,模块永远无法找到不正确的日期。(注意:由于某些特殊限制,无法进行 UI 验证,因此必须由中间件系统进行验证)。
有没有办法我可以使用相同的 util 包来处理这个问题,或者可以通过任何 3rd 方 jar 来处理这个问题?请给个建议
Java.util.date 包是自动更正日期。例如:如果我们将日期传递为“2018-02-35”,它会自动将其更改为“2018-03-07”,这是一个有效日期。
基本上,要求是验证用户输入的日期,但随着日期自动更正,模块永远无法找到不正确的日期。(注意:由于某些特殊限制,无法进行 UI 验证,因此必须由中间件系统进行验证)。
有没有办法我可以使用相同的 util 包来处理这个问题,或者可以通过任何 3rd 方 jar 来处理这个问题?请给个建议
即使我面临同样的问题。但是经过一些研究,我发现 DateFormat 类中有一个方法 (setLenient()) 可以禁用此行为。
DateFormat df = new SimpleDateFormat(DATE_FORMAT);
df.setLenient(false);
Java Docs:指定日期/时间解析是否宽松。通过宽松的解析,解析器可以使用启发式方法来解释不精确匹配该对象格式的输入。使用严格的解析,输入必须匹配这个对象的格式。
你可以写 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;