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

时间:2014-07-23 06:24:28

标签: java date-format simpledateformat

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

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

4 个答案:

答案 0 :(得分:35)

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

  

对于使用缩写年份模式(“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日。

方法SimpleDateFormat.set2DigitYearStart(Date)可用于修复年份。

答案 1 :(得分:15)

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

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"));

根据SimpleDateFormat.set2DigitYearStart(Date) javadoc,

  

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

答案 2 :(得分:6)

可以使用方法set2DigitYearStart。它允许您指定开始日期。解析日期将在[开始日期,开始日期+ 100年]的区间内。

有关详细信息,请参阅documentation

答案 3 :(得分:0)

可能你正在寻找这个。

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