Определение формата даты в Java

Я беру даты из различных API, таких как G + FB и Skype, у меня есть одна следующая функция, которую я получил от здесь

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"); //Aug 24, 1990
        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");
    }};



    public String determineDateFormat(String dateString) {
        for (String regexp : DATE_FORMAT_REGEXPS.keySet()) {
            if (dateString.toLowerCase().matches(regexp)) {
                return DATE_FORMAT_REGEXPS.get(regexp);
            }
        }
        return "Unknown Format"; // Unknown format.
    }

Он работает для большинства форматов даты, хотя если я встречу дату вроде: 24 августа 1990 г. Я хочу знать, какой это формат даты? МММ ДД ГГГГ что ли? Также какие-нибудь подсказки, чтобы я мог добавить это к уже указанному регулярному выражению?


person User3    schedule 01.08.2014    source источник
comment
put("^[a-z]{3} \\d[1,2}, \\d{4}$", "MMM dd, yyyy"); выполните поиск в документации API шаблонов Java, и вы найдете описание регулярного выражения. Карта - это немного неправильная структура данных; и ^...$ может быть .... Подойдет List<Pair<Pattern, DateFormat>> или String[][]. Также вы можете немедленно вернуть Date, null или LinkedSet дат (совпадающие даты в порядке извлечения) с помощью синтаксического анализа.   -  person Joop Eggen    schedule 01.08.2014
comment
Я не так хорошо разбираюсь в регулярных выражениях, учусь на собственном опыте с помощью Learn reg ex. Позвольте мне попробовать ваше предложение и большое спасибо :)   -  person User3    schedule 01.08.2014
comment
Это дает мне java.util.regex.PatternSyntaxException: отсутствует закрывающая скобка в классе символов рядом с индексом 25:   -  person User3    schedule 01.08.2014
comment
Попробуйте вместо этого это регулярное выражение: ^[a-z]{3}\\s\\d{2},\\s\\d{4}$   -  person SamYonnou    schedule 01.08.2014
comment
Сэм отправит это в качестве ответа, я приму!   -  person User3    schedule 01.08.2014
comment
@SamYonnou, спасибо за исправление, но лучше оставить \\d{1,2}, что означает, что для дня, 1 июня 2020 года, также принимается 1 цифра. МММ, также возможно \\d{1,2}(th|nd|rd)?.   -  person Joop Eggen    schedule 01.08.2014
comment
@JoopEggen Я вижу, однако, если это должно соответствовать формату даты dd (используется в чем-то вроде SimpleDateFormatter), я почти уверен, что он должен соответствовать \\d{2}.   -  person SamYonnou    schedule 01.08.2014


Ответы (2)


Шаблон на 24 августа 1990 г. - «MMM dd, yyyy» с en Locale.

person Evgeniy Dorofeev    schedule 01.08.2014
comment
Как преобразовать его в ГГГГ-ММ-ДД? - person User3; 01.08.2014
comment
Дата d = новый SimpleDateFormat (MMM dd, yyyy, Locale.US) .parse (24 августа 1990 г.); Строка str = новый java.sql.Date (d.getTime ()). ToString (); - person Evgeniy Dorofeev; 01.08.2014

Вы пробовали вместо этого использовать для этой цели определенную библиотеку? Я считаю, что Natty очень полезен для меня, когда я обрабатываю случайные форматы даты из внешних API.

https://github.com/joestelmach/natty

Вы также можете опробовать его на сайте в интерактивной форме, чтобы увидеть, что он может и не может обрабатывать, прежде чем вы решите интегрировать его в свой код.

http://natty.joestelmach.com/try.jsp

person dectarin    schedule 01.08.2014
comment
Я скептически отношусь к использованию библиотеки, я не хочу увеличивать размер своего .apk, потому что у меня уже есть так много SDK. Нет более легкого пути? - person User3; 01.08.2014
comment
Хм, если вы не хотите использовать библиотеку, я думаю, вам просто нужно будет добавлять все больше и больше регулярных выражений в список по мере необходимости. MMM dd, yyyy - это правильный формат для вашей возвращаемой строки в любом случае, но я оставлю вам регулярное выражение, так как это не моя сильная сторона! - person dectarin; 01.08.2014