最近在Apache POI的库更新后,我也升级了其他一些API。我使用的另一个库将所有单元格内容读取为String,然后我必须将此字符串解析为Date。
当用户开始输入日期为dd-mm-yy时出现问题,年份显示为00yy AD。
根据SimpleDateFormat
对于解析,如果模式字母的数量大于2,则为年份 无论数字位数如何,都按字面解释。所以使用 模式“MM / dd / yyyy”,“01/11/12”解析到1月11日,12 A.D。
所以问题是,进入两个字母年份的四个字母年份是否更好?
另一个问题是,如果用两个字母格式预测年份,最好的方法是什么。 因为问题将在解析年度之后出现
Bond Start Date : 12-Jan-98 (1998)
Bond End Date : 12-Jan-70 (2070)
此致 Hanumant
答案 0 :(得分:0)
目前尚不清楚你在问什么。
如果您询问如何指定接受2位数年份的日期格式(仅限)并按常规解释它们,则应使用"dd-mm-yy"
。
如果您询问如何指定接受2位数年份的日期格式并按常规解释它们, AND ALSO 处理4(或更多)个数字年份,那么您不能。正如javadoc所说,如果使用"dd-mm-yyyy"
,则在公元一世纪将2位数年份解释为年。
一种可能的解决方案是使用两种格式。首次尝试使用"dd-mm-yy"
进行解析,如果失败,请尝试"dd-mm-yyyy"
。
但这是一个黑客......如果用户可能确实需要输入历史日期,则会出现问题。
如果你问你应该做什么,那么我建议你不要使用模糊的ad-hoc格式,这会迫使你(有效地)猜测用户的意思。
如果用户 以基于字符的形式输入日期/时间,则要求他们使用其中一种ISO 8601格式,并在解析用户提供的日期时严格/时间字符串。
否则,请为用户提供日期选择器小部件。
好吧,这是问题的核心不是吧!在20世纪,我们都知道两位数的年份意味着什么。你只是在前面打了19杆。 (啊......那是过去的美好时光!)另一个问题是,如果用两个字母格式预测年份,最好的方法是什么。
现在有必要使用不同的启发式方法。 SimpleDateFormat
使用的启发式由javadoc描述:
“对于使用缩写年份模式(”y“或”yy“)进行解析,SimpleDateFormat必须解释相对于某个世纪的缩写年份。它通过将日期调整为在80年前和20年之内来实现在创建SimpleDateFormat实例之后。例如,使用1997年1月1日创建的“MM / dd / yy”模式和SimpleDateFormat实例,字符串“01/11/12”将被解释为1月11日, 2012年,字符串“05/04/64”将被解释为1964年5月4日。“
启发式是在“现在”之后的80年到20年之后。所以实际上在1998年1月12日是在1998年和70年1月12日在1970年...如果你使用SimpleDateFormat
解析“yy”格式。
如果您需要日期来表示其他内容,那么您将需要使用不同的日期解析器。例如,如果您使用Joda-time库,则可以指定“pivot year”;即本世纪中叶,两位数的年份下降。
参考: