Я знаю, что этот вопрос задают вполне немного, и очевидно Вы не можете проанализировать произвольную дату. Однако я нахожу, что библиотека python-dateutil может проанализировать каждую дату, которую я бросаю в нее, все при требовании абсолютно нулевого усилия в выяснении строки формата даты. Время Joda всегда продается как являющийся большим синтаксическим анализатором даты Java, но он все еще требует, чтобы Вы решили, какой формат Ваша дата находится в том, прежде чем Вы выберете Формат (или создадите Ваше собственное). Вы не можете только назвать DateFormatter.parse(mydate) и волшебно вернуть объект Даты.
Например, дата "среда 04 марта 5:09:06 GMT-06:00 2009" правильно анализируется с 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 2009";
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
DateTime dt = fmt.parseDateTime(date);
System.out.println(date);
И создание Вашего собственного DateTimeFormatter побеждает цель, так как это, кажется, совпадает с использованием SimpleDateFormatter со строкой правильного формата.
Существует ли сопоставимый способ проанализировать дату в Java, как python-dateutil? Я не забочусь об ошибках, я просто хочу это к главным образом идеальному.
Что я видел, так это класс Date util, который содержит несколько типичных форматов даты. Таким образом, когда вызывается DateUtil.parse(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[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 символов;))
Вы можете легко расширить его самостоятельно с помощью новых шаблонов регулярных выражений и форматов даты .