如何使DateFormat猜测世纪?

我试图将“dd-MM-yy”格式的String解析为Date对象。 问题是它试图猜测日期的世纪。

当从01到31指定时,年份被解释为2000s(21世纪),32 t0 99被认为是1900年代(20世纪)。

 SimpleDateFormat fm =new SimpleDateFormat("dd-MM-yy"); String datestr="21-11-31"; try { Date date= fm.parse(datestr); System.out.println(date); } catch (ParseException e) { } 

谁能帮我? 我怎么能说明我只是整整地在21世纪工作。 我并没有完全试图寻找操纵字符串或根据条件移动日期的技巧。

您可以使用set2DigitYearStart()方法更改用于解释2位数据条目的世纪。

 SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy"); String aDate = "03/17/40"; Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(Calendar.YEAR, 2000); dateFormat.set2DigitYearStart(cal.getTime()); System.out.println(dateFormat.get2DigitYearStart()); System.out.println(dateFormat.parse(aDate)); 

将于2040年3月17日发行。

从文档 :

对于使用缩写年份模式(“y”或“yy”)进行解析,SimpleDateFormat必须解释相对于某个世纪的缩写年份。 它通过将日期调整为创建SimpleDateFormat实例之前的80年和20年之后来实现此目的。 例如,使用1997年1月1日创建的“MM / dd / yy”模式和SimpleDateFormat实例,字符串“01/11/12”将被解释为2012年1月11日,而字符串“05/04 / 64“将被解释为1964年5月4日。在解析期间,只有由Character.isDigit(char)定义的由两个数字组成的字符串才会被解析为默认世纪。 字面上解释任何其他数字字符串,例如一位数字符串,三位或更多位数字符串,或不是所有数字的两位数字符串(例如,“ – 1”)。 所以使用相同的模式解析“01/02/3”或“01/02/003”,如公元1月2日。 同样,“01/02 / -3”被解析为公元前1月2日。

它似乎没有提到任何调整[-80; +20] [-80; +20]范围。 我怀疑你最好的选择是将两位数年份扩展为四位数forms:

 datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1");