2017-10-28 152 views
-2

我已經玩了近6個小時,現在看了其他問題,但似乎無法弄清楚我做錯了什麼,給了我這些奇怪的結果。這裏是我的代碼如下DateFormat.parse()給出錯誤的結果

String dateStr = "20171230"; 
    StringBuilder sb = new StringBuilder(); 
    sb.append(dateStr.subSequence(0, 4)) 
     .append("/") 
     .append(dateStr.substring(4,6)) 
     .append("/") 
     .append(dateStr.substring(6,8)); 

    dateStr = sb.toString(); 

    System.out.println("date string is " + dateStr); 

    DateFormat df = new SimpleDateFormat("yyyy/mm/dd"); 

    df.setLenient(false); 

    Date Date = null; 

    try { 
     Date = df.parse(dateStr); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("Date is " + Date); 

輸出

date string is 2017/12/30 
Date is Mon Jan 30 00:12:00 CST 2017 

日期應該是12月30日,而不是1月30日有人能告訴我爲什麼發生這種情況。

回答

2

您傳遞一種簡單日期格式的格式在您認爲該月份的位置有幾分鐘定義。

注意時間輸出如何設置太00:12。

相反,使用 YYYY/MM/DD

1

請允許我給幾個是去有點超出你問什麼建議。我認爲我的建議應該是有幫助的。

首先,你不應該堅持長期過時的類DateSimpleDateFormatThe modern Java date and time API通常更好用,並且包含更少的令人不快的意外。它被稱爲JSR-310或java.time

其次,在從中提取日期之前,不應使用StringBuilder重新格式化您的字符串。 20171230可以直接解析成日期。更糟糕的是,你轉換字符串的方式,你不驗證長度:如果碰巧有9位數字而不是8位數字,你會想要捕捉它並拋出一個異常,但你的代碼只需要前8位數字,忽略是否​​有更多。

最後,正如Trenton Trama在the other answer中指出的那樣,格式模式字符串區分大小寫。無論您使用大寫字母還是小寫字母,它都很重要。使用不正確的情況很可能會導致錯誤的結果。這既適用於過時API,也適用於現代API。幸運的是,當談到解析時,現代API更傾向於在使用錯誤的情況下拋出異常,所以至少你被告知有什麼錯誤。

最後,最後,當你希望別人讀取你的代碼時,像其他的stackoverflowers一樣,使用編碼約定來幫助我們。變量名稱以小寫字母開頭。如果您有一個名爲Date的類和一個名爲Date的變量,則會特別令人困惑。

上述款項達:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuMMdd"); 
    String dateStr = "20171230"; 
    LocalDate date = LocalDate.parse(dateStr, dtf); 
    System.out.println("Date is " + date); 

輸出是:

Date is 2017-12-30 

問:我可以使用現代化的API與我的Java版本?

如果至少使用Java ,您可以。