两个字母的年份,是否允许?

时间:2013-06-26 13:56:06

标签: java date-format 2-digit-year

最近在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

1 个答案:

答案 0 :(得分:0)

目前尚不清楚你在问什么。

  1. 如果您询问如何指定接受2位数年份的日期格式(仅限)并按常规解释它们,则应使用"dd-mm-yy"

  2. 如果您询问如何指定接受2位数年份的日期格式并按常规解释它们, AND ALSO 处理4(或更多)个数字年份,那么您不能。正如javadoc所说,如果使用"dd-mm-yyyy",则在公元一世纪将2位数年份解释为年。

    一种可能的解决方案是使用两种格式。首次尝试使用"dd-mm-yy"进行解析,如果失败,请尝试"dd-mm-yyyy"

    但这是一个黑客......如果用户可能确实需要输入历史日期,则会出现问题。

  3. 如果你问你应该做什么,那么我建议你不要使用模糊的ad-hoc格式,这会迫使你(有效地)猜测用户的意思。

    • 如果用户 以基于字符的形式输入日期/时间,则要求他们使用其中一种ISO 8601格式,并在解析用户提供的日期时严格/时间字符串。

    • 否则,请为用户提供日期选择器小部件。


  4.   

    另一个问题是,如果用两个字母格式预测年份,最好的方法是什么。

    好吧,这是问题的核心不是吧!在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”;即本世纪中叶,两位数的年份下降。

    参考: