10

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

当指定从 01 到 31 时,年份被解释为 2000 年代(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 世纪工作。我并不是在尝试寻找诸如操作字符串或根据条件移动日期之类的技巧。

4

2 回答 2

16

您可以使用该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 日印刷。

于 2012-05-24T06:44:22.290 回答
7

文档中:

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

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

datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1");
于 2012-05-24T06:33:10.547 回答