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

7

考虑以下代码片段:

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上知道它是一个无效的日期。
有什么建议吗?


1
可能是如何在Java中进行日期合理性检查的重复问题。 - Jens
@Jens:主要问题是如何使用Calendar类获取dd.MM.yyyy格式,然后使用setLenient方法进行操作。 - Farhan stands with Palestine
1
尽可能避免使用Java的Date类。对于Java 7及更早版本,请使用http://www.joda.org/joda-time/,在Java 8中请使用Java Time。 - Thirler
3个回答

3

你所需要的是 SimpleDateFormat 的选项 setLenient()

将 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
}

2
应该使用 setLenient(false) 以实现严格操作。 - Brett Walker
@TimoSta:不,这并没有解决问题。我仍然得到相同的答案。 - Farhan stands with Palestine
@BrettWalker 正确,应该是 false。 - TimoStaudinger
@ShirgillAnsari,请看一下我的修改。正如Brett Walker指出的那样,它应该设置为false而不是true。 - TimoStaudinger
@TimoSta:你试过使用String dateStr = "Mon Jan 30 00:00:00 IST 2015";这个吗?在这种情况下,它不应该失败,但会抛出一个无法解析的异常。 - Farhan stands with Palestine
@TimoSta:没事的,TimoSta。1月30日不是星期一。我今晚怎么这么糊涂呢? - Farhan stands with Palestine

2
您可以使用DateFormat.setLenient(boolean)方法(来自Javadoc)进行解析。严格解析时,输入必须与此对象的格式匹配。
DateFormat ddMMyyyy = new SimpleDateFormat("dd.MM.yyyy");
ddMMyyyy.setLenient(false);

1

设置日期格式化程序不要宽容...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接