4

有没有办法强制 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
  • 还有很多...
4

4 回答 4

7

DateTimeFormatterBuilder.appendFixedDecimal() 可能会满足您的需求。

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

于 2009-11-11T11:38:29.247 回答
1

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

于 2009-10-23T08:58:34.740 回答
1

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

于 2009-10-23T09:13:19.763 回答
0

您想从输入“0001-01-01”作为日期的用户那里得到什么(也就是说,他们输入了 4 位数字作为年份,但前三位是零)?“0999-12-31”呢?还有'999-12-31'?那么“10000-01-01”——臭名昭著的Y10K 1问题呢?

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

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

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


1我不打算在 5000-01-02 之前着手解决 Y10K 问题。

于 2009-10-29T03:08:35.130 回答