解析Java中的任何日期

我知道这个问题已经问了很多,显然你不能解析任何日期。但是,我发现python-dateutil库能够解析我向它抛出的每个日期,而在找出日期格式字符串方面绝对需要零的工作。Joda time始终被当作是出色的Java日期解析器而出售,但是它仍然需要你在选择格式(或创建自己的格式)之前确定日期的格式。你不能只调用DateFormatter.parse(mydate)并神奇地获取Date对象。

例如,日期“ Wed Mar 04 05:09:06 GMT-06:00 2019”已使用python-dateutil正确解析:

import dateutil.parser

print dateutil.parser.parse('Wed Mar 04 05:09:06 GMT-06:00 2009')

但是以下Joda时间通话无法正常工作:

    String date = "Wed Mar 04 05:09:06 GMT-06:00 2019";

DateTimeFormatter fmt = ISODateTimeFormat.dateTime();

DateTime dt = fmt.parseDateTime(date);

System.out.println(date);

创建自己的DateTimeFormatter不能达到目的,因为这似乎与使用带有正确格式字符串的SimpleDateFormatter相同。

有没有类似的方法可以在Java中解析日期,例如python-dateutil?我不在乎错误,我只是希望它能完美实现。

回答:

最好的选择是向正则表达式寻求帮助以匹配日期格式模式和/或进行强行强制。

几年前,我写了一个DateUtil课程来完成这项工作。这是相关的摘录:

private static final Map<String, String> DATE_FORMAT_REGEXPS = new HashMap<String, String>() {{

put("^\\d{8}$", "yyyyMMdd");

put("^\\d{1,2}-\\d{1,2}-\\d{4}$", "dd-MM-yyyy");

put("^\\d{4}-\\d{1,2}-\\d{1,2}$", "yyyy-MM-dd");

put("^\\d{1,2}/\\d{1,2}/\\d{4}$", "MM/dd/yyyy");

put("^\\d{4}/\\d{1,2}/\\d{1,2}$", "yyyy/MM/dd");

put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}$", "dd MMM yyyy");

put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}$", "dd MMMM yyyy");

put("^\\d{12}$", "yyyyMMddHHmm");

put("^\\d{8}\\s\\d{4}$", "yyyyMMdd HHmm");

put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}$", "dd-MM-yyyy HH:mm");

put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy-MM-dd HH:mm");

put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}$", "MM/dd/yyyy HH:mm");

put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy/MM/dd HH:mm");

put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMM yyyy HH:mm");

put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMMM yyyy HH:mm");

put("^\\d{14}$", "yyyyMMddHHmmss");

put("^\\d{8}\\s\\d{6}$", "yyyyMMdd HHmmss");

put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd-MM-yyyy HH:mm:ss");

put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy-MM-dd HH:mm:ss");

put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "MM/dd/yyyy HH:mm:ss");

put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy/MM/dd HH:mm:ss");

put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMM yyyy HH:mm:ss");

put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMMM yyyy HH:mm:ss");

}};

/**

* Determine SimpleDateFormat pattern matching with the given date string. Returns null if

* format is unknown. You can simply extend DateUtil with more formats if needed.

* @param dateString The date string to determine the SimpleDateFormat pattern for.

* @return The matching SimpleDateFormat pattern, or null if format is unknown.

* @see SimpleDateFormat

*/

public static String determineDateFormat(String dateString) {

for (String regexp : DATE_FORMAT_REGEXPS.keySet()) {

if (dateString.toLowerCase().matches(regexp)) {

return DATE_FORMAT_REGEXPS.get(regexp);

}

}

return null; // Unknown format.

}

(双括号初始化,只是为了让所有内容都适合最大100个字符的长度;))

你可以使用新的regex和dateformat模式轻松地自己扩展它。

以上是 解析Java中的任何日期 的全部内容, 来源链接: utcz.com/qa/402019.html

回到顶部