【问题标题】:How to make SimpleDateFormat.parse() fail hard?如何使 SimpleDateFormat.parse() 失败?
【发布时间】:2014-11-08 10:59:34
【问题描述】:

当提供的日期字符串与给定格式 100% 不匹配时,我需要下面的代码开始失败。

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
format.setLenient(false);
format.parse("09/10/20144");

出于某种原因,即使使用 setLenient(false),此调用也会返回实际的 09/10/20144 日期。 我尝试将“new ParsePosition(0)”传递给解析调用,但这根本没有帮助,因为日期仍然返回为 09/10/20144。我需要确切日期格式的任何例外才能失败。有什么好的方法吗?

【问题讨论】:

  • 给定2014/10/09时会失败吗?因为我认为它不关心数字的确切数量——在 8000 年后代码将停止工作。但是如果你希望它只接受那么多字母,你可以随时检查输入字符串的长度。
  • 这实际上是一个非常简单但很好的主意,我认为这将解决我现在的问题。谢谢

标签: java date simpledateformat


【解决方案1】:

这是一种方法,虽然有点奇怪:

public static Date parseDate(String input) {
    final String format = "MM/dd/yyyy";
    if (input.length != format.length) { //Check the length, helps to avoid the cases mentioned earlier.
        throw new ParseException("Lengths do not match", 0);
    }
    SimpleDateFormat format = new SimpleDateFormat(format);
    format.setLenient(false);
    return format.parse(input);
}

(这是我之前在评论中所说的)

【讨论】:

    【解决方案2】:

    您提供给 SDF 的字符串仅告知格式化程序输入部分的顺序和类型(有关每个字段的间隔的信息量是有限的,因为他应用了一些计算以使其“有意义”)。

    要实现您想要的,您可以使用正则表达式进行初始检查。在你的情况下:

    String input = "09/10/20144";
    if (input == null || !input.matches("[01]\\d/[0123]\\d/[12]\\d{3}")) {
        throw new IllegalArgumentException("Invalid value or format");
    } else {
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
        format.setLenient(false);
        format.parse(input);
    }
    

    上述正则表达式检查:

    • 月份有 2 位数字,第一位是 0 或 1
    • 日期有 2 位数字,第一位是 {0,1,2,3} 中的一位
    • 年份有 4 位数字,第一个数字是 1 或 2。

    更多关于Java正则表达式的信息:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

    【讨论】:

    • 这个想法也不错,但我必须能够处理来自更高逻辑的多种日期格式,所以我不想涉足拥有多个正则表达式来处理所有可能日期的业务格式。但是谢谢你的建议。
    • 好的,yoda 时间怎么样,正如这个 SO 中所建议的那样:stackoverflow.com/questions/489538/… ?
    猜你喜欢
    • 2010-12-26
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多