【问题标题】:Is this a Java DateFormat bug?这是 Java DateFormat 错误吗?
【发布时间】:2010-06-11 20:19:25
【问题描述】:

模式是“dd-MM-yyyy”

我认为字符串“01-01-2010mwwwwwwwwwwwwwww”不满足模式,但下面的代码显示相反。

谁能解释一下原因?

public static void main(String[] args) throws Exception {

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

    Date date = df.parse("01-01-2010mwwwwwwwwwwwwwww");

    System.out.println(date);
}

谢谢

【问题讨论】:

  • 不幸的是 DateFormat 默默地解析这个。
  • NAPWAD(按设计工作不是问题)

标签: java date-format simpledateformat


【解决方案1】:

parse 方法不会尝试匹配整个输入字符串。即前缀01-01-2010匹配,就够了。

来自DateFormat.parse

从给定字符串的开头解析文本以生成日期。 该方法可能不会使用给定字符串的整个文本。


如果您需要判断它是否是“完全匹配”,您可以尝试以下方法:

SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

String strDate = "01-01-2010mwwwwwwwwwwwwwww";
ParsePosition pp = new ParsePosition(0);
Date date = df.parse(strDate, pp);
System.out.println("Complete match: " + (pp.getIndex() == strDate.length()));

strDate = "01-01-2010";
pp = new ParsePosition(0);
date = df.parse(strDate, pp);
System.out.println("Complete match: " + (pp.getIndex() == strDate.length()));

这会打印出来

Complete match: false
Complete match: true

【讨论】:

    【解决方案2】:

    这是因为 DateFormat 的默认 lenient 参数为 true。这意味着解析器将解析输入字符串,即使它的格式不正确。这会(有时)导致不正确的结果。

    另一方面,我们可以强制解析器严格遵守给定的模式。这意味着输入错误的字符串会引发异常。

    public static void main(String[] args) throws Exception {
      SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
      df.setLenient(false); // Switch to strict mode
      Date date = df.parse("01-01-2010mwwwwwwwwwwwwwww"); // This will throw an exception
      System.out.println(date);
    }
    

    【讨论】:

    • 这个答案是完全错误的,因为结果与 lenient 标志无关。
    猜你喜欢
    • 2016-07-12
    • 2011-07-13
    • 2013-12-17
    • 2012-03-18
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多