我正在尝试将“{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世纪工作。我并没有完全试图寻找操纵字符串或根据条件移动日期的技巧。
答案 0 :(得分:13)
您可以使用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日印刷。
答案 1 :(得分:6)
对于使用缩写年份模式(“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]
范围的方法。我怀疑你最好的选择是将两位数年份扩展为四位数形式:
datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1");