我正在搜索一个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。假设我可以访问日期的时区,我可以确定它是美国还是欧洲格式?有人能告诉我这样做吗?谷歌搜索但没有发现任何东西。
问题是有些格式无法正确猜测。
一个简单的例子是01/02/2013
。这是2月1日还是1月2日?或者甚至更糟:01/02/09
?
两种格式都存在。 (谢谢你,英国和美国!)
因此,任何格式的猜测者都必须依靠这些格式的运气,或故意为这些格式失败。
python模块dateutil.parser
可以作为尽力而为解析器的示例。对不起,我不知道java等价物。但你可能想看看Joda Time
http://labix.org/python-dateutil#head-b95ce2094d189a89f80f5ae52a05b4ab7b41af47
它实际上有参数dayfirst
和yearfirst
。
然后有一个perl模块:
https://metacpan.org/pod/Time::ParseDate
您可以使用该模块中的优先级列表。盲目地尝试一些模式并不是很快(优化的词法分析器会更快),但它可能对你来说已经足够好了,除非你猜测数百万条记录的格式。
这没有神奇的解决方案。记住日期/时间格式也取决于您的语言环境。
实际上,你可以做的最好的事情是定义一个格式列表,并逐个“尝试”它们,直到找到一个(或没有)适合。
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”的东西。
祝好运!
由于我没有为我的情况找到方便的解决方案,我写了一个简单的静态实用程序方法,帮助了我。如果添加更多格式,在集合中包装格式并对其进行迭代可以使事情变得更容易。
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";
}
您至少需要一个有序的模式候选列表。一旦你有了这个,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。
解析器将对解析日期宽容。