【问题标题】:Prevent invalid date from getting converted into date of next month in jdk6?防止无效日期在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 上意识到无效日期?
有什么建议吗?

【问题讨论】:

  • @Jens:主要问题是我将如何使用 Calendar 类获取 dd.MM.yyyy 格式,然后使用 setLenient 方法进行处理。
  • 尽可能避免使用 java Date 类。在 Java 7 和更早版本中使用 joda.org/joda-time,在 Java 8 中使用 Java Time。

标签: java jdk6


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多