繁体   English   中英

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

[英]How to parse four digit year only (with Joda Time)?

有没有办法强制 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。

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

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

  • 2009-11-11
  • 星期三 2009-11-11T15:00:00
  • 2009/11/11 15:00
  • 还有很多...

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

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

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

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

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

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

  • 如果这不是合法的值,那么在解析日期之后,您将无法检查年份值。

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM