防止无效日期在jdk6中转换为下个月的日期?

Posted

技术标签:

【中文标题】防止无效日期在jdk6中转换为下个月的日期?【英文标题】:Prevent invalid date from getting converted into date of next month in jdk6? 【发布时间】:2015-08-14 23:30:16 【问题描述】:

考虑sn-p:

String dateStr = "Mon Jan 32 00:00:00 IST 2015";    // 32 Jan 2015

DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
DateFormat ddMMyyyy = new SimpleDateFormat("dd.MM.yyyy");
System.out.println(ddMMyyyy.format(formatter.parse(dateStr)));

给我输出

01.02.2015     //   Ist February 2015

我希望阻止这种情况,以使用户在 UI 上意识到无效日期? 有什么建议吗?

【问题讨论】:

How to sanity check a date in java 的可能重复项 @Jens:主要问题是我将如何使用 Calendar 类获取 dd.MM.yyyy 格式,然后使用 setLenient 方法进行处理。 尽可能避免使用 java Date 类。在 Java 7 和更早版本中使用 joda.org/joda-time,在 Java 8 中使用 Java Time。 【参考方案1】:

SimpleDateFormat 的选项setLenient() 就是您要找的。​​p>

将 isLenient 设置为 false 后,它将不再接受格式正确的日期,并在其他情况下抛出 ParseException。

String dateStr = "Mon Jan 32 00:00:00 IST 2015";    // 32 Jan 2015

DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
formatter.setLenient(false);
DateFormat ddMMyyyy = new SimpleDateFormat("dd.MM.yyyy");
try 
    System.out.println(ddMMyyyy.format(formatter.parse(dateStr)));
 catch (ParseException e) 
    // Your date is invalid

【讨论】:

严格来说应该是setLenient(false) @TimoSta:不,这并没有解决问题。我仍然得到相同的答案。 @BrettWalker 正确,应该是假的 @ShirgillAnsari 看看我的编辑。正如 Brett Walker 指出的那样,它应该设置为 false 而不是 true。 @TimoSta: 你试过 String dateStr = "Mon Jan 30 00:00:00 IST 2015";在这种情况下,它一定不会失败,但会抛出一个无法解析的异常。【参考方案2】:

将日期格式化程序设置为不宽大...

DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
formatter.setLenient(false);

【讨论】:

【参考方案3】:

您可以使用DateFormat.setLenient(boolean) 来(来自Javadoc)通过严格的解析,输入必须匹配此对象的格式。

DateFormat ddMMyyyy = new SimpleDateFormat("dd.MM.yyyy");
ddMMyyyy.setLenient(false);

【讨论】:

以上是关于防止无效日期在jdk6中转换为下个月的日期?的主要内容,如果未能解决你的问题,请参考以下文章

防止日期转换溢出

如何从全日历年视图中隐藏上个月和下个月的日期和事件?

java中定义一个字符串类型的日期 算出这个月的第一天和下个月的第一天。

DB2 如何选择前 2 个月的日期

如何在liquibase中设置当月第一个日期和下个月的默认值?

获取从当前日期到下一个完整月的记录(直到下个月的最后一个日期)mysql [重复]