有没有办法强制Joda时间只在它们包含四位数年份时解析日期?例如:
尝试以下代码:
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或检查字符串的内容/长度可能相当困难。
一些真实的例子可能如下所示:
答案 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问题。