2009-10-23 108 views
4

有没有办法强制约达时间解析日期,只有当他们包含四位数年?例如:如何仅解析四位数年份(与乔达时间)?

  • 2009-11-11 - 应该解析
  • 11年9月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
  • 还有更多...

回答

6

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

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

+0

我是盲人!非常感谢。顺便说一下,该方法称为appendFixedDecimal()。 – 2009-11-18 15:43:58

1

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

+0

我编辑了与您的建议结果的帖子。不幸的是我无法得到它的工作。谢谢! – 2009-10-23 09:45:35

+1

嗯,有趣的是,我不会期待这一点。我建议乔达时间的邮件列表,作者()挂在那里。 – skaffman 2009-10-23 10:03:31

1

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

+0

问题是你会希望parseDateTime方法检查 – Tarski 2011-06-10 13:25:34

+0

@Tarski,如果它确实会很好。你可以改变图书馆来做到这一点,并建议他们更新他们的图书馆。 – 2011-06-10 13:28:49

0

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

  • 如果这是一个合法的值,那么你被卡住发现什么是用户输入的日期(任何其他解析已经完成大概之后)的年份部分的长度,并确保它是至少(或者恰好?)四位数字。

  • 如果这不是一个合法的值,那么您在解析日期之后检查年份值会停滞不前。

  • 或者您可以将代码修改并包含您对有效年份的首选定义。


我不打算开始之前5000-01-02固定Y10K问题的工作。

+0

我正在寻找一种方法将其限制为四位数,所以0999将被视为999年,而999则不会被解析。 Y10K也不是问题......至少还没有。无论如何,它似乎是唯一的解决方案是在解析它之前检查字符串。 – 2009-10-30 10:38:27