Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Joda Date&;分析多种格式的时间API_Java_Parsing_Exception_Jodatime - Fatal编程技术网

Java 使用Joda Date&;分析多种格式的时间API

Java 使用Joda Date&;分析多种格式的时间API,java,parsing,exception,jodatime,Java,Parsing,Exception,Jodatime,我正在使用Joda解析包含日期/时间的第三方日志文件。日期/时间是两种不同格式中的一种,具体取决于我正在分析的日志文件的年龄 目前我有如下代码: try { return DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").parseDateTime(datePart); } catch (IllegalArgumentException e) { return DateTimeFormat.forPattern("E, MMM dd

我正在使用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在《有效Java第二版》中的建议(第57项:仅在异常情况下使用异常)。这也使得很难确定是否由于日志文件中的日期/时间错误而发生IllegalArgumentException


你能推荐一种不误用异常的更好的方法吗?

不幸的是,我不相信Joda Time有任何这样的功能。有一个“tryParseDateTime”方法会很好,但它并不存在

我建议你把这种行为隔离到你自己的课堂上(一个有一系列模式的课堂,然后依次尝试每一种模式),这样丑陋就只存在于一个地方。如果这会导致性能问题,您可能希望尝试使用一些启发式方法来猜测首先尝试哪种格式。例如,在您的例子中,如果字符串以数字开头,那么它可能是第一个模式


请注意,Joda Time中的
DateTimeFormatter
s通常是不可变的-您不应该每次要分析一行时都创建一个新的。创建一次并重用它们。

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


只需使用生成器创建两个格式化程序,并对每个格式化程序调用
toParser()
。然后使用生成器使用
append

组合它们。您可以创建多个解析器,并使用以下方法将它们添加到生成器中:


也许在使用之前先猜一下模式。这个答案让我的评论有了意义。我很满意:)我还是个初学者,所以我不会回答这个问题。我知道DateTimeFormatters是不可变的,但为了简洁起见,我在代码示例中显式创建了它们。没有令人无法忍受的性能问题,所以我想我会按照您的建议,创建一个类来隐藏丑陋的.Boo Java,因为它缺少像DotNet这样的TryParse函数。缺少tryParse例程和泛型类型擦除是我最大的两个抱怨。哇!直接从那个人自己那里回答!喜欢你的工作Stephen.嗯,我试过这个,但是Joda Time似乎希望解析的字符串匹配由两个附加在一起的模式组成的模式,而不是一个或另一个。也许论坛是一个更好的位置来查看这是否是一个bug-这工作非常完美。我猜JodaStephen是这么想的,但当我试图按照他的指示进行操作时,解析失败。如果您同时想要dd MM yy和dd MM yyyy(无法解析异常),则这对例如“5-5-5”和“5-5-2005”不起作用。后来我发现dd-MM-yy也能很好地解析dd-MM-yyy,因此解决了我的问题。奇怪的是,尽管有各种各样的
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" );