如何解析四位数年份(使用Joda Time)?

时间:2009-10-23 08:46:14

标签: java datetime jodatime

有没有办法强制Joda时间只在它们包含四位数年份时解析日期?例如:

  • 2009-11-11 - 应解析
  • 09-11-11 - 不应解析

尝试以下代码:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");

解析为0009-11-11。显然,方法appendYear中的minDigits仅用于在打印日期时进行格式化 如果我使用appendYearOfEra(),结果是一样的。如果我使用appendYearOfCentury(),它会将年份解析为1909年。

我们正在实现一般数据解析器,它将识别各种类型的输入。此示例也是实际交易的缩短形式(为简单起见)。现实生活场景解析可以有工作日的日期,月份作为单词,时间,区域和分隔月,日和年的不同字符。因此,编写RegEx或检查字符串的内容/长度可能相当困难。

一些真实的例子可能如下所示:

  • 2009-11-11
  • 周三2009-11-11T15:00:00
  • 2009/11/11 15:00
  • 以及更多...

4 个答案:

答案 0 :(得分:7)

DateTimeFormatterBuilder.appendFixedDecimal()可能会做你需要的。

或者,您可以实现DateTimeParser接口来创建所需的任何解析器并将其传递到DateTimeFormatterBuilder。

答案 1 :(得分:1)

您可以使用DateTimeFormatterBuilder构建极其特定的解析器和格式化程序。通常不需要直接使用这个类,因为大多数常见的格式在API的其他地方更容易获得,但这是他们在幕后使用的构建器类。

答案 2 :(得分:1)

您可以检查日期字符串的长度。

答案 3 :(得分:0)

你想从输入'0001-01-01'作为日期的用户得到什么(也就是说,他们输入了4位数,但前三位是零)?那么'0999-12-31'怎么样? '999-12-31'?那么'10000-01-01' - 臭名昭着的Y10K 1 问题呢?

  • 如果这是一个合法的值,那么你就会发现用户键入的日期长度(可能是在完成任何其他解析之后),并确保它在最少(或者确实如此?)四位数。

  • 如果这不是一个合法的值,那么在解析日期后你就会检查年份值。

  • 或者您可以接受代码并对其进行修改,使其包含您对有效年份的首选定义。


1 我不打算在5000-01-02之前开始修复Y10K问题。