2013-02-21 119 views
4

我正在寻找一个java库,可以解析一个字符串到一个POJO没有指定的格式。我研究了POjava。有没有其他的库可以做类似的事情?自动日期/时间分析器没有指定格式

DateTime dateTime = DateTimeParser.parse("21/02/13"); 

//If unclear use the cultural information passed 
DateTime dateTime = DateTimeParser.parse("01/02/13", new Locale("en-us")); 

//Should also work with time zones 
DateTime dateTime = DateTimeParser.parse("2011/12/13T14:15:16+01:00"); 

我发现同样的问题Intelligent date/time parser for Java以下链接,但不是非常有用的答案。 Joda和JChronic都不做我想要的。纠正我,如果我错了。

更新:

我之所以说乔达并没有解决我的目的是,乔达预计ISO8601格式或您指定像“年月日”任意格式的解析字符串。由于我需要处理多种格式,因此我无法对此格式进行硬编码。

我有一个针对美国或欧洲日期格式(即mm/dd/yy或dd/mm/yy)消除歧义的解决方案。假设我可以访问日期的时区,我可以确定它是美式还是欧式格式?有人能告诉我如何做到这一点吗?谷歌搜索,但没有发现。

+3

你会想到的第一个版本与'6月5日/ 2013'吗?无论你选择什么,你都会为地球的相当大的一部分错误。 – 2013-02-21 19:02:41

+0

你看乔达时间吗? – 2013-02-21 19:03:57

+0

如果第一行有歧义,请使用默认文化信息,除非在第二行代码中指定了一个文字信息 – saravanan07 2013-02-21 19:05:53

回答

3

我找到了我的问题的答案。我用这个特殊的库POjava。这page解释了如何格式化日期+时间字符串,而不指定任何格式。但是,为了使图书馆正常工作,您必须指定日期排序,例如Day,然后是Month或Month,然后是Day。

8

问题是,有一些格式,不能被猜测是正确的。

一个简单的例子是01/02/2013。这是2月1日还是1月2日?甚至更糟:01/02/09

两种格式都存在。 (谢谢你,英国和美国!)

所以任何格式猜测者将不得不依靠这些格式的运气,或故意故意为这些格式。

python模块dateutil.parser可以作为尽力而为解析器的一个例子。对不起,我不知道一个Java等价物。但你可能想看看Joda Time

http://labix.org/python-dateutil#head-b95ce2094d189a89f80f5ae52a05b4ab7b41af47

它实际上有参数dayfirstyearfirst

然后有一个Perl模块:

https://metacpan.org/pod/Time::ParseDate

你也许能够使用的优先级列表从该模块。盲目尝试一些模式的速度并不是很快(优化的词法分析器会更快),但除非您猜测数百万条记录的格式,否则对您而言可能已经足够好了。

+0

如果第一行有歧义(请参阅原始问题中的代码)使用默认的文化信息,除非在第二个代码行中指定了一个。我可以从任何图书馆获得这种情报吗? – saravanan07 2013-02-21 19:36:49

0

对此没有神奇的解决方案。记住日期/时间格式也可以取决于您的区域设置。

实际上,您可以做的最好的是定义一个格式列表,然后逐个“尝试”它们,直到找到合适的一个(或者没有)。

private static final FORMAT_1 = "MM/dd/yyyy'T'HH:mm:ss.SSS" 
private static final FORMAT_2 = "MM/dd/yyyy'T'HH:mm:ss" 
private static final FORMAT_3 = "MM/dd/yyyy" 

记得在java中使用日期/时间对象时要考虑线程的安全性。我有一个类正在做这种名为“ThreadSafeDateTimeFormatter”的东西。

祝你好运!

0

由于我没有找到方便的解决方案,我写了一个简单的静态工具方法帮助我。如果添加更多格式,将集合中的格式封装并迭代它可以使事情变得更简单。

public static Date returnDateFromDateString(String propValue) throws Exception { 

    SimpleDateFormat sdfFormat1 = new SimpleDateFormat(IDateFConstants.DATE_STRING_FORMAT_1); 
    SimpleDateFormat sdfFormat2 = new SimpleDateFormat(IDateFConstants.DATE_STRING_FORMAT_2); 
    SimpleDateFormat sdfISO8601 = new SimpleDateFormat(IDateFConstants.DATE_STRING_ISO_8601); 

    try { 
     return sdfFormat1.parse(propValue); 
    } catch (ParseException e) { } 

    try { 
     return sdfFormat2.parse(propValue); 
    } catch (ParseException e) { } 

    try { 
     return sdfISO8601.parse(propValue); 
    } catch (ParseException e) { } 

    throw new Exception(IDateFConstants.DATE_FORMAT_ERROR); 
} 

其中IDateFConstants看起来像

public interface IDateFConstants { 

public static final String DATE_STRING_ISO_8601 = "yyyy-MM-dd'T'HH:mm:ss"; 
public static final String DATE_STRING_FORMAT_1 = "dd.MM.yyyy"; 
public static final String DATE_STRING_FORMAT_2 = "dd.MM.yyyy HH:mm:ss"; 

public static final String DATE_FORMAT_ERROR = "Date string wasn't" + 
              + "formatted in known formats"; 

}