【问题标题】:Java: How to parse a date strictly?Java:如何严格解析日期?
【发布时间】:2012-10-16 18:58:42
【问题描述】:

SimpleDateFormat 是一个非常友好的解析器,它滚动生成的日期而不是抛出错误。如何在没有正则表达式等的情况下严格解析日期?

fmt = new SimpleDateFormat("dd.MM.yyyy")
fmt.parse("10.11.2012")   // it works
fmt.parse("10.1150.2012") // it works but it's unwanted

【问题讨论】:

  • 它可能会也可能不会解决您的问题,但是,如果您使用 Java 处理日期,我强烈推荐 Joda Time 库

标签: java validation parsing date


【解决方案1】:

不幸的是 fmt.setLenient(false);不会实现严格的日期格式。它可以帮助一些人,例如,如果 lenient==true,使用格式“yyyyMMdd”解析“2010-09-01”将成功,但结果非常奇怪:2009/12/09。

即使 lenient==false parse() 仍然表现得很宽松。模式“yyyy/MM/dd”允许使​​用“2010/01/5”。对于“yyyy/yyyy”模式,像“1999/2011”这样的数据分歧是可以容忍的(产生于 2011 年)。模式匹配后也允许垃圾。例如:“20100901”和“20100901andGarbage”都将匹配“yyyyMMdd”。

我编写了一个 SimpleDateFormat 的扩展,它强制执行严格的模式匹配。你可以在这里找到它:

SimpleDateFormat.parse() ignores the number of characters in pattern

在我的版本中,format() 和 parse() 是函数反函数。这是我认为大多数人所期望的。

【讨论】:

    【解决方案2】:

    java.time

    您还可以在 Java 8 及更高版本 (Tutorial) 中使用 java.time package。它的解析严格检查日期值。

    例如:

    String strDate = "20091504";
    TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate);
    

    直接给出:

    Exception in thread "main" java.time.format.DateTimeParseException:
    Text '20091504' could not be parsed:
    Invalid value for MonthOfYear (valid values 1 - 12): 15
    

    【讨论】:

    • DateTimeFormatter 具有三种解析器样式(与 DateFormat 的两种相比):严格、智能和宽松。幸运的是 smart 是默认设置,它会捕获大多数不需要的输入,甚至可能是所有明显不正确的内容。对于更严格的验证,您当然可以尝试严格的解析器样式。 The documentatio 信息量很大。
    • DateTimeFormatter 提供了很酷的静态方法。但它允许 1 到 31 之间的任何一天。例如,它不会为 2 月 31 日抛出异常。 DateTimeFormatter.ofPattern("yyyyMMdd").parse("20200231");
    【解决方案3】:

    fmt.setLenient(false); 是你要找的。​​p>

    【讨论】:

    • 可悲的是,设置 lenient false 仍然是宽松的。模式“yyyy/MM/dd”允许使​​用“2010/01/5”。模式“yyyyMMdd”允许使​​用 20100901andGarbage。我发布了一个答案,使用扩展 SimpleDateFormat 的类保证严格匹配。
    • java.text.DateFormat.parse 的文档说“该方法可能不会使用给定字符串的整个文本。”,所以行为是正确的。
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多