簡體   English   中英

為什么SimpleDateFormat.parse接受無效的日期字符串?

[英]Why does SimpleDateFormat.parse accept an invalid date string?

我有一個java代碼,以特定格式輸入日期。

static Date parseDate(String userInput){
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(userInput);
            System.out.println(date);
        }catch(ParseException pe){
            date=null;
            System.out.println("Not a valid date");
        }
        return date;
    }

現在我進入2015-13-11 89:90:90 ,這是一個無效的日期。 但它將Thu Jan 14 18:31:30 IST 2016作為日期返回。 為什么會這樣? 如何讓它作為日期返回null?

javadocs的一瞥中,它似乎使用了一種lenient的解析模式,它接受格式不佳的輸入:

添加此行

format.setLenient(false);

初始化DateFormat對象后出現修復它。

我將試圖解釋為什么會這樣。

日期不同,因為超出其字段最大值的值將匯總到下一個更大的字段中。

我不確定它的解決順序,但這是一般情況:

鑒於2015-13-11 89:90:90

  1. 該年度被解釋為2015年,正確設置。 目前2015-01-01 00:00:00
  2. 月份被解釋為13,13 / MONTHS_IN_A_YEAR = 1,因此添加了一年,我們將月份設置為1(13個月 - 1年)。 目前2016-01-01 00:00:00
  3. 日期被解釋為11.這是正確設置的。 目前2016-01-11 00:00:00
  4. 小時被解釋為89,89 / HOURS_IN_A_DAY = 3,因此添加了3天,我們將小時設置為17(89小時 - 3天)。 目前2016-01-14 17:00:00
  5. 分鍾被解釋為90,90 / MINUTES_IN_A_HOUR = 1,因此添加了1小時,我們將分鍾設置為30(90分鍾 - 1小時)。 目前2016-01-14 18:30:00
  6. 第二個被解釋為90,90 / SECONDS_IN_A_MINUTE = 1,因此添加1分鍾並將秒數設置為30(90秒-1分鍾)。

這讓我們留下2016-01-14 18:31:30。

暫無
暫無

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

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