Java.util自动更正无效日期

时间:2018-07-14 05:54:47

标签: date auto java.util.date xmlgregoriancalendar

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

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

有没有办法我可以使用相同的util软件包来处理此问题,或者可以通过任何第三方jar来处理?请指教

2 个答案:

答案 0 :(得分:0)

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

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

Java文档: 指定日期/时间解析是否宽松。通过宽大的解析,解析器可以使用启发式方法来解释与该对象的格式不完全匹配的输入。在严格分析的情况下,输入必须与该对象的格式匹配。

答案 1 :(得分: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;