自动日期/时间解析器,不指定格式

问题描述 投票:5回答:5

我正在搜索一个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都没有做我想要的。如果我错了,请纠正我。

更新:

我说Joda没有解决我的目的的原因是,Joda希望字符串以ISO8601格式或您指定的任何格式解析,如“yyyyMMdd”。我将无法对此格式进行硬编码,因为我需要处理多种格式。

我有一个解决方案,用于消除美国或欧洲日期格式的模糊性,即mm / dd / yy或dd / mm / yy。假设我可以访问日期的时区,我可以确定它是美国还是欧洲格式?有人能告诉我这样做吗?谷歌搜索但没有发现任何东西。

java datetime date-parsing
5个回答
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

您可以使用该模块中的优先级列表。盲目地尝试一些模式并不是很快(优化的词法分析器会更快),但它可能对你来说已经足够好了,除非你猜测数百万条记录的格式。


4
投票

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


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";

}

0
投票

您至少需要一个有序的模式候选列表。一旦你有了这个,Apache DateUtils有一个parseDate(String dateString, String[] patterns)方法,让你轻松地尝试日期字符串上的模式列表,并通过匹配的第一个解析它:

public static Date parseDate(String str,
                         String[] parsePatterns)
                  throws ParseException
Parses a string representing a date by trying a variety of different parsers.

解析将依次尝试每个解析模式。如果解析整个输入字符串,则认为解析成功。如果没有解析模式匹配,则抛出ParseException。

解析器将对解析日期宽容。

© www.soinside.com 2019 - 2024. All rights reserved.