SimpleDateFormat 给出错误的日期而不是错误

发布于 2024-11-08 02:05:14 字数 169 浏览 5 评论 0原文

我正在使用以下模式和日期

日期:13-13-2007

模式:dd-MM-yyyy

输出:Sun Jan 13 00:00:00 IST 2008 或者 2008-01-13 00:00:00.0

我期待这里出现异常。当给定日期不正确时,我可以做什么来生成异常。

I am using following pattern and date

Date : 13-13-2007

Pattern : dd-MM-yyyy

Output: Sun Jan 13 00:00:00 IST 2008
Or
2008-01-13 00:00:00.0

I was expecting exception here. What can i do to generate exception when given date is inproper.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清君侧 2024-11-15 02:05:14

使用 DateFormat.setLenient (false) 告诉 DateFormat/SimpleDateFormat 您希望它是严格的。

Use DateFormat.setLenient(false) to tell the DateFormat/SimpleDateFormat that you want it to be strict.

魄砕の薆 2024-11-15 02:05:14

Set Lenient 适用于大多数情况,但如果您想检查确切的字符串模式,那么这可能会有所帮助,

    String s = "03/6/1988";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        sdf.setLenient(false);
        Date d = sdf.parse(s);
        String s1 = sdf.format(d);
        if (s1.equals(s))
            System.out.println("Valid");
        else
            System.out.println("Invalid");
    } catch (ParseException ex) {
        // TODO Auto-generated catch block
        ex.printStackTrace();
    }

如果您输入“03/06/1988”,那么您将获得有效的结果。

Set Lenient will work for most cases but if you wanna check the exact string pattern then this might help,

    String s = "03/6/1988";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        sdf.setLenient(false);
        Date d = sdf.parse(s);
        String s1 = sdf.format(d);
        if (s1.equals(s))
            System.out.println("Valid");
        else
            System.out.println("Invalid");
    } catch (ParseException ex) {
        // TODO Auto-generated catch block
        ex.printStackTrace();
    }

If you give the input as "03/06/1988" then you'll get valid result.

七颜 2024-11-15 02:05:14

java.time

我想贡献现代答案。当 2011 年提出这个问题时,使用 SimpleDateFormatDate 是合理的。现在已经不是了。这些类的设计总是很糟糕,并于 2014 年被现代 Java 日期和时间 API java.time 所取代,因此现在早已过时了。

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu")
            .withResolverStyle(ResolverStyle.STRICT);

    String dateString = "13-13-2007";
    LocalDate date = LocalDate.parse(dateString, dateFormatter);

此代码给出了您所期望的异常(并且有充分的理由期望):

线程“main”中出现异常java.time.format.DateTimeParseException:
无法解析文本“13-13-2007”:MonthOfYear 值无效
(有效值 1 - 12):13

另请注意并享受准确且信息丰富的异常消息。

DateTimeFormatter 具有三种所谓的解析器样式:严格、智能和宽松。智能是默认设置,您很少需要其他任何东西。如果您想确保在所有情况下捕获所有无效日期,请使用 strict。

链接

java.time

I should like to contribute the modern answer. When this question was asked in 2011, it was reasonable to use SimpleDateFormat and Date. It isn’t anymore. Those classes were always poorly designed and were replaced by java.time, the modern Java date and time API, in 2014, so are now long outdated.

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu")
            .withResolverStyle(ResolverStyle.STRICT);

    String dateString = "13-13-2007";
    LocalDate date = LocalDate.parse(dateString, dateFormatter);

This code gives the exception you had expected (and had good reason to expect):

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

Please also notice and enjoy the precise and informative exception message.

DateTimeFormatter has three so-called resolver styles, strict, smart and lenient. Smart is the default, and you will rarely need anything else. Use strict if you want to be sure to catch all invalid dates under all circumstances.

Links

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文