2012-07-15 113 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);