2012-03-22 192 views
10

當我試圖將字符串解析爲日曆時,出現了最奇怪的錯誤。 它似乎弄亂了我用來設置結果日曆時間的Date對象。這個錯誤很不一致(或者我沒有看到它的邏輯)。任何人都可以指出我可能做錯了什麼?使用SimpleDateFormat.parse()時獲取錯誤數據

public class caltest{ 
public static final SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS"); 

public static void main(String[] args) { 
    String date1 = "1992-03-11 12:00:12.123"; 
    String date2 = "1993-03-11 12:00:12.123"; 
    String date3 = "1994-03-11 12:00:12.123"; 
    String date4 = "1995-03-11 12:00:12.123"; 
    parseStringAsCalendar(date1); 
    parseStringAsCalendar(date2); 
    parseStringAsCalendar(date3); 
    parseStringAsCalendar(date4); 
} 
public static String calendarToString(Calendar cal) { 
    return sdf.format(cal.getTime()); 
} 

public static Calendar parseStringAsCalendar(String s) { 
    Date time = null; 
    try { 
     time = sdf.parse(s); 
    } catch (ParseException e) { 
     System.out.println("Exception"); 
     e.printStackTrace(); 
    } 
    System.out.println(time.toString()); 
    GregorianCalendar ret = new GregorianCalendar(); 
    ret.setTime(time); 

    return ret; 
} 

}

輸出是:

Sun Dec 29 12:00:12 CET 1991 
Sun Dec 27 12:00:12 CET 1992 
Sun Dec 26 12:00:12 CET 1993 
Sun Jan 01 12:00:12 CET 1995 

回答

18

你在你的格式說明,這是週年(如Java 7的,我相信)使用YYYY。你想yyyy,這只是「年」。 (請參閱SimpleDateFormat documentation。)

我懷疑日期的其餘部分已經過期,因爲您試圖指定月份和日期,這些在一週中不是真正的「功能」......如果您已指定在和星期幾「每週的星期」,它有可能給一些有意義的結果,但前提是你真的意味着使用一週裏,我懷疑:)

+0

這兩個答案都非常有用,這一個照在潛在的問題更多的是光的。我正在檢查錯誤的文檔。 – Tegi 2012-03-22 23:44:22

+3

你剛剛在互聯網上從幾個小時的無果搜索中拯救了我!謝謝 – KoW 2013-11-13 13:47:02

+0

* year *和* week year *之間的區別究竟是什麼?該文檔對於這個區別有點稀疏(就像Calendar的文檔一樣)。 – tytk 2015-07-23 19:04:07

3

使用此:

public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

年份爲小寫y,而非大寫Y。就這樣,結果是:

Wed Mar 11 12:00:12 EST 1992 
Thu Mar 11 12:00:12 EST 1993 
Fri Mar 11 12:00:12 EST 1994 
Sat Mar 11 12:00:12 EST 1995 

在這裏看到: