如何控制 SimpleDateFormat 解析为 19xx 或 20xx?

2022-09-01 20:02:01

有没有办法将以下日期字符串解析为而不是?July 23 1916July 23 2016

System.out.println(new SimpleDateFormat("yy/MM/dd", Locale.US).parse("16/07/23"));

答案 1

Java Doc(http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)说:

为了解析缩写的年份模式(“y”或“yy”),SimpleDateFormat必须解释相对于某个世纪的缩写年份。它通过将日期调整为在创建 SimpleDateFormat 实例之前的 80 年内和之后的 20 年内来实现此目的。例如,使用“MM/dd/yy”模式和在 1997 年 1 月 1 日创建的 SimpleDateFormat 实例,字符串“01/11/12”将被解释为 Jan 11, 2012,而字符串“05/04/64”将被解释为 May 4, 1964。

该方法可用于固定年份。SimpleDateFormat.set2DigitYearStart(Date)


答案 2

如果我理解你的问题,那么是的,

SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd", Locale.US);
Calendar cal = Calendar.getInstance(Locale.US);
cal.set(1900, 0, 1);
sdf.set2DigitYearStart(cal.getTime());
System.out.println(sdf.parse("16/07/23"));

Per the SimpleDateFormat.set2DigitYearStart(Date) javadoc,

设置 100 年周期 2 位数字的年份将被解释为从用户指定的日期开始。