0

最近在 Apache POI 库升级之后,我也升级了一些其他的 API。我使用的另一个库将所有单元格内容读取为字符串,然后我必须将此字符串解析为日期。

当用户开始输入日期为 dd-mm-yy 时出现问题,年份显示为 00yy AD。

根据文档SimpleDateFormat

对于解析,如果模式字母的数量超过 2 个,则按字面解释年份,而不考虑位数。所以使用模式 "MM/dd/yyyy", "01/11/12" 解析到公元 12 年 1 月 11 日

所以问题是,输入四个字母的年份比输入两个字母的年份更好吗?

另一个问题是,如果年份是两个字母格式,那么预测年份的最佳方法是什么。由于问题将在解析以下年份时出现

Bond Start Date : 12-Jan-98 (1998)
Bond End Date   : 12-Jan-70 (2070)

问候,哈努曼

4

1 回答 1

0

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

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

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

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

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

  3. 如果您要问您应该做什么,那么我建议您摆脱模棱两可的临时格式,这些格式会迫使您(有效地)猜测用户的意思。

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

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


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

好吧,这就是问题的关键不是吗!在 20 世纪,我们都知道 2 位数年份的含义。你刚刚在前面打了19。(啊……那是过去的美好时光!)

现在有必要使用不同的启发式。SimpleDateFormatjavadoc 描述了使用的启发式方法:

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

启发式是“现在”之前的 80 年到之后的 20 年。所以实际上 12-Jan-98 是在 1998 年,12-Jan-70 是在 1970 年......如果你使用SimpleDateFormat“yy”格式解析。

如果您需要日期来表示其他含义,那么您将需要使用不同的日期解析器。例如,如果您使用 Joda-time 库,则可以指定“枢轴年”;即世纪中年,其中两位数年份下降。

参考:

于 2013-06-26T14:17:17.637 回答