[英]How to parse four digit year only (with Joda Time)?
有没有办法强制 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。
我们正在实现一个通用数据解析器,它将识别各种类型的输入。 此外,该示例是真实交易的缩写形式(为简单起见)。 现实生活场景解析日期,可以将工作日、月份作为单词、时间、区域和不同的字符分隔月、日和年。 因此,编写正则表达式或检查字符串的内容/长度可能相当困难。
一些真实的例子可能如下所示:
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.