ударил в разборе пользовательского формата данных в Java - PullRequest
3 голосов
/ 01 февраля 2012

Я пытаюсь проанализировать дату в определенном пользовательском формате.

СРЕДА 25 ЯНВ 2012 - 12:44:07

вот так ..

Я создал SimpleDateFormat для этого ..

SimpleDateFormat sdf = new SimpleDateFormat("EEEE DD MMM YYYY - HH:MM:SS aa" );

проблема в буквальном смысле дня.оно приходит как 25, 23, 02. Я получаю исключение для этой вещи ...

помогите, как преодолеть эту проблему.

Ответы [ 4 ]

3 голосов
/ 01 февраля 2012

Вы можете удалить литерал дня, используя такое регулярное выражение.

String dateString = "WEDNESDAY 25th JAN 2012 - 12:44:07 PM";
SimpleDateFormat format = new SimpleDateFormat("EEEEEEE dd MMM yyyy - HH:mm:ss aa", new Locale("EN"));
dateString = dateString.replaceAll("(.*[0-9]{1,2})(st|nd|rd|th)(.*)", "$1$3");
Date parsedDate = format.parse(dateString);

System.out.println(parsedDate);

(не обращайте внимания на локаль, я откуда-то еще :))

2 голосов
/ 01 февраля 2012

Вы можете разбить строку даты, которую вы пытаетесь разобрать на части, и удалить две ошибочные буквы следующим образом:

String text = "WEDNESDAY 21st JAN 2012 - 12:44:07 PM";
String[] parts = text.split(" ", 3);  // we only need 3 parts. No need splitting more
parts[1] = parts[1].substring(0, 2);
String parseableText = String.format("%s %s %s", parts[0], parts[1], parts[2]);  
SimpleDateFormat sdf = new SimpleDateFormat("EEEE dd MMM yyyy - hh:mm:ss aa" );

try {
    java.util.Date dt = sdf.parse(parseableText);
} catch (ParseException e) {
    e.printStackTrace();
}

В вашей строке синтаксического анализа также были некоторые ошибки. Дело важно для даты и времени. См. SimpleDateFormat javadoc для справки.

1 голос
/ 01 февраля 2012

Вам придется как-то вручную это сделать.

например. Метод следующим образом:

public static String makeItParseable(String dateStr) {
    if(dateStr.contains("st ")) {
        return dateStr.replace("st ", " ");
    } else if(dateStr.contains("nd ")) {
        return dateStr.replace("nd ", " ");
    } else if(dateStr.contains("rd ")) {
        return dateStr.replace("rd ", " ");
    } else {
        return dateStr.replace("th ", " ");
    }
}

И использовать его для разбора входной строки:

String dateStr = "WEDNESDAY 1st JAN 2012 - 12:44:07 PM";
dateStr = makeItParseable(dateStr);
DateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy - hh:mm:ss a");
Date date = dateFormat.parse(dateStr);
0 голосов
/ 01 февраля 2012

Добавьте «.th» к строке формата, следуя тому, что люди указали в этой теме

Как вы форматируете день месяца, чтобы сказать «11-й», «21-й» или «23-й»"на Яве?(порядковый номер)

...