使用 Joda 日期和时间 API 解析多种格式

2022-08-31 12:43:38

我正在使用Joda解析包含日期/时间的第三方日志文件。日期/时间采用两种不同格式之一,具体取决于我正在解析的日志文件的期限。

目前我有这样的代码:

try {
    return DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").parseDateTime(datePart);
} catch (IllegalArgumentException e) {
    return DateTimeFormat.forPattern("E, MMM dd, yyyy HH:mm").parseDateTime(datePart);
}

这有效,但违反了Joshua Bloch在 Effective Java 2nd Edition(第57项:仅在特殊情况下使用例外)的建议。这也使得很难确定非法参数异常是否由于日志文件中的错误日期/时间而发生。

您能建议一种不滥用异常的更好方法吗?


答案 1

您可以使用 DateTimeFormatterBuilder.append 方法创建多个解析器并将它们添加到生成器中:

DateTimeParser[] parsers = { 
        DateTimeFormat.forPattern( "yyyy-MM-dd HH" ).getParser(),
        DateTimeFormat.forPattern( "yyyy-MM-dd" ).getParser() };
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append( null, parsers ).toFormatter();

DateTime date1 = formatter.parseDateTime( "2010-01-01" );
DateTime date2 = formatter.parseDateTime( "2010-01-01 01" );

答案 2

Joda-Time通过允许指定多个解析器来支持这一点 - DateTimeFormatterBuilder#append

只需使用构建器创建两个格式化程序并调用每个格式化程序即可。然后使用生成器通过 组合它们。toParser()append


推荐