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

Java 如何仅解析四位数年份(使用Joda时间)?,java,datetime,jodatime,Java,Datetime,Jodatime,有没有办法强迫Joda time只解析包含四位数年份的日期?例如: 2009年11月11日-应该解析 09-11-11-不应解析 尝试了以下代码: DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLitera

有没有办法强迫Joda time只解析包含四位数年份的日期?例如:

  • 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年

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

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

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

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

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

您希望从输入“0001-01-01”作为日期的用户那里得到什么(也就是说,他们输入了该年的4位数字,但前三位是零)?“0999-12-31”和“999-12-31”如何?以及“10000-01-01”——臭名昭著的1问题如何

  • 如果这是一个合法的值,那么您必须找出用户键入的日期的年份部分的长度(可能在完成任何其他解析之后),并确保它至少是(或者确切地说是?)四位数字

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

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



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

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


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

我根据您的建议编辑了这篇文章。不幸的是,我无法让它正常工作。谢谢!嗯,很有趣,我没有料到。我建议使用joda time邮件列表,作者等一下。我正在寻找一种方法,将其精确限制为四位数字,这样0999将被视为999年,999将不进行解析。另外,Y10K不是问题……至少还没有。无论如何,似乎唯一的解决方案是在解析前检查字符串。我是瞎的!非常感谢。顺便说一下,该方法称为appendFi问题是您可能希望parseDateTime方法进行检查that@Tarski,如果可以,那就太好了。您可以将库更改为这样做,并建议他们更新库。