用Javaparsing任何date

我知道这个问题有很多问题,显然你不能parsing任何date。 然而,我发现python-dateutil库能够parsing每一个date,而所有的date格式string都是绝对零度的。 乔达时间总是作为一个伟大的Javadateparsing器出售,但它仍然需要你select格式(或自己创build)之前,确定你的date是什么格式。 你不能只是调用DateFormatter.parse(mydate),神奇地得到一个Date对象。

例如,date“Wed Mar 04 05:09:06 GMT-06:00 2009”已经正确地用python-dateutilparsing:

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

但下面的乔达时间通话不起作用:

  String date = "Wed Mar 04 05:09:06 GMT-06:00 2009"; DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); DateTime dt = fmt.parseDateTime(date); System.out.println(date); 

而创build自己的DateTimeFormatter将会失败,因为这与使用带有正确格式string的SimpleDateFormatter相同。

有没有类似的方法来parsingJava中的date,如python-dateutil? 我不在乎错误,我只是希望它完美。

你最好的赌注是真正要求帮助正则expression式匹配date格式模式和/或做野蛮强制。

几年前,我写了一个愚蠢的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[az]{3}\\s\\d{4}$", "dd MMM yyyy"); put("^\\d{1,2}\\s[az]{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[az]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMM yyyy HH:mm"); put("^\\d{1,2}\\s[az]{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[az]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMM yyyy HH:mm:ss"); put("^\\d{1,2}\\s[az]{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 char;))

您可以使用新的正则expression式和date格式轻松地扩展它。

有一个叫做Natty的漂亮的图书馆,我认为这符合你的目的:

Natty是用Java编写的自然语言dateparsing器。 给定dateexpression式,natty将应用标准的语言识别和翻译技术来产生具有可选parsing和语法信息的相应date的列表。

你也可以尝试在线 !

我所看到的是一个Date util类,它包含几种典型的date格式。 所以,当调用DateUtil.parse(date)时,它会尝试在内部parsing每个date格式的date,并且只有在内部格式都不能parsing的情况下才抛出exception。

这基本上是对你的问题的一种powershell方法。