2012-07-15 115 views
2

我想在MM-dd格式解析字符串到Java日期。由於未指定年份,因此解析日期應該在當年。只應該解析有效的日期字符串,所以我應該在SimpleDateFormat中使用setLenient(false)解析日期字符串(MM-DD)到Java日期默認年

public static Date parseDate(String ds) throws ParseException { 
    SimpleDateFormat df = new SimpleDateFormat("MM-dd"); 
    df.setLenient(false); 
    Date d = df.parse(ds); 
    Calendar cal = Calendar.getInstance(); 
    int year = cal.get(Calendar.YEAR); 
    cal.setTime(d); 
    cal.set(Calendar.YEAR, year); 
    return cal.getTime(); 
} 

這似乎很好,直到我通過一個參數「02-29」。今年(2012年)是閏年,2012-02-29是有效日期,「02-29」應該已經解析成功。

我發現當我沒有在SimpleDateFormat中指定年份時,它解析到1970年。而1970年不是閏年,「02-29」未能解析。因此,解析到1970年的日期並且在解析策略之後設置當年並不完美。

什麼是解析MM-dd格式的字符串到日期的最好方式在Java中(日期應設置爲當前年度)?

PS1:我搜索了這個話題,發現這個網站的許多的問題和答案,但我無法找到滿意的答案。 PS2:df.setLenient(false);是很重要的,因爲只有有效的日期字符串應該被成功解析。不應該分析無效的日期字符串,如「01-32」,「02-30」等。

在此先感謝。

+1

你可以使用「YYYY-MM-DD」,並解析它之前添加實際一年的字符串。 – 2012-07-15 16:31:33

+1

你能解釋爲什麼你只是不接受我的答案? – 2012-12-31 17:20:10

回答

4

這也算是一個小哈克,但你總是可以只釘年到日期字符串的結尾解析,這樣才:

ds += "-" + Calendar.getInstance().get(Calendar.YEAR); 
SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy"); 
// Parse date as usual 
2

獲取一年的日曆,你在做代碼,解析格式字符串設定爲MM-dd-yyyy然後做

Date d = df.parse(ds + "-" + year);