簡體   English   中英

為什么在解析無效日期時不會拋出預期的異常?

[英]Why is the expected exception not thrown on parsing invalid date?

我得到兩個字符串,我必須將它們轉換為日期並顯示它們之間的天數差異。 但如果兩個日期之一無效,我必須拋出異常。

這是我迄今為止完成此任務的代碼:

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String d1 = sc.next();
        String d2 = sc.next();

        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

        try {
            Date date1 = formatter.parse(d1);
            Date date2 = formatter.parse(d2);

            long dt = (date1.getTime() - date2.getTime()) + 3600000;
            long days = (dt / 86400000L);

            System.out.println(days);
        } catch (ParseException e) {
            System.out.println("Data inválida");
            e.printStackTrace();
        }
    }
}

但是如果我輸入一個無效的日期,比如02/29/2021 ,它會轉換為03/01/2021而不是拋出異常。

時間

@MCEmperor 我如何更改格式化程序以使用 LocalDate?

像 MCEmperor 一樣,我建議您使用 java.time,現代 Java 日期和時間 API,用於您的日期工作。

public class Main {
    private static final DateTimeFormatter FORMATTER
            = DateTimeFormatter.ofPattern("dd/MM/uuuu", Locale.ROOT)
                    .withResolverStyle(ResolverStyle.STRICT);

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String d1 = sc.next();
        String d2 = sc.next();
        
        try {
            LocalDate date1 = LocalDate.parse(d1, FORMATTER);
            LocalDate date2 = LocalDate.parse(d2, FORMATTER);
            
            long days = ChronoUnit.DAYS.between(date2, date1);
            
            System.out.println(days);
        } catch (DateTimeParseException dtpe) {
            System.out.println("Data inválida");
            dtpe.printStackTrace();
        }
    }
}

示例會話:

03/02/2021
02/29/2021
Data inválida
java.time.format.DateTimeParseException: Text '02/29/2021' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 29
    at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
    at java.base/java.time.LocalDate.parse(LocalDate.java:428)
    at Main.main(Main.java:18)

您可能還會注意到在代碼中計算兩個日期之間的天數更加自然和簡單。

你的代碼出了什么問題?

但是如果我輸入一個無效的日期,比如02/29/2021 ,它會轉換為03/01/2021而不是拋出異常。

就是這樣設計的。 我同意你的看法,這是一個令人困惑、令人驚訝和不幸的設計。 當您將非閏年的 2 月 29 日傳遞給具有默認設置的SimpleDateFormat時,它只會將其視為 2 月 28 日之后的一天,即 3 月 1 日。這只是不使用該類的眾多原因之一。

關聯

Oracle 教程:解釋如何使用 java.time 的日期時間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM