我不确定汤姆为什么会说“这与序列化有关”,但是他有正确的说法:
private void initializeDefaultCentury() { calendar.setTime( new Date() ); calendar.add( Calendar.YEAR, -80 ); parseAmbiguousDatesAsAfter(calendar.getTime());}这是SimpleDateFormat.java中的第813行,该过程很晚。到那时为止,年份是正确的(日期部分的其余部分也是正确的),然后将其减80。
啊哈!
对的调用
parseAmbiguousDatesAsAfter()是与以下调用相同的私有函数
set2DigitYearStart():
private void parseAmbiguousDatesAsAfter(Date startDate) { defaultCenturyStart = startDate; calendar.setTime(startDate); defaultCenturyStartYear = calendar.get(Calendar.YEAR);}public void set2DigitYearStart(Date startDate) { parseAmbiguousDatesAsAfter(startDate);}现在我知道发生了什么。彼得在有关“苹果和橙子”的评论中是对的!SimpleDateFormat中的年份是“默认世纪”的第一年,该范围是两位数字的年份字符串(例如,“
1/12/14”)被解释为的范围。参见http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html#get2DigitYearStart%28%29:
因此,为了获得“效率”而不是清晰度,SimpleDateFormat中的年份用于存储“解析两位数年份的100年期间的开始”,而不是当前年份!
谢谢,这很有趣-终于让我安装了jdk源(我的
/分区上只有4GB的总空间。)



