2012-02-01 3 views
3

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

Среда 25 января 2012 - 12:44:07 PM

как это ..

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

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

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

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

+0

D есть день в году, d в день в месяц .. http://docs.oracle.com/javase/7 /docs/api/java/text/SimpleDateFormat.html – L7ColWinters

+3

Возможный дубликат [Как вы форматируете день месяца, чтобы сказать «11-й», «21-й» или «23-й» в Java?] (http: // stackoverflow. com/questions/4011075/how-do-you-format-the-day-of-the-month-to-say-11th-21st-or-23rd-in-java) – kosa

+0

Вопрос не в том, как * вывести * "th", "st" или "rd"; но как разбирать его из строки. – nybbler

ответ

2

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

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.

+0

nybbler, вы создаете подстроку? Это нормально ... но есть ли какой-либо вариант, чтобы я мог его структурировать, потому что его два символа не могут использовать подстановочные знаки? – karthik

+0

@ karthik Не знаю, о чем я знаю. Я полагаю, вы могли бы вложить try..catches 3 глубоко, чтобы покрыть 3 возможности для двух персонажей, но это был бы не мой подход. – nybbler

+0

то, что я подумал, что если мы можем обеспечить постоянные значения в SimpleDateFormat как этот SimpleDateFormat sdf = new SimpleDateFormat("EEEE DD'th' MMM YYYY - HH:MM:SS aa"); , если у нас есть только «-й» в качестве текста в качестве примера. Я задавался вопросом, почему я не могу использовать подстановочные знаки, потому что я могу совместить с 'rd' или любыми другими двумя символами вместо того, чтобы сопоставлять только с'th '. Если есть опция, мы можем пойти на подстроку ... нет вопросов – karthik

0

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

How do you format the day of the month to say "11th", "21st" or "23rd" in Java? (ordinal indicator)

+0

это может быть любой из трех 11-го может прийти или 21-й может прийти ... но у него будет только два символа любой опции – karthik

+0

Я не думаю, что нить, которую вы указали проблемы, связанные с проблемой, упомянутой здесь – karthik

+0

Я думаю, что это так, как показано, как создать формат SDF, способный обрабатывать строку даты OP, которая хочет разобрать. Теперь, в потоке, который люди хотят отформатировать, вы хотите разобрать, тем не менее оба хотят правильно использовать SDF с nth, 2nd, 3rd и т. Д. ... – Alfabravo

1

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

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

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

, если датаStr имеет «четвертый пятый», то не станет ли она «пятым пятым»? –

+0

@vivek_jonam: Я думаю, что это не должно, но вы попробовали? –

+0

Это не сделало этой ошибки. Не заметил конечного пробела в «th». –

3

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

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); 

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

+0

хорошая работа ... не знаю, как заменить все, что reg ex выполняет ... вы можете объяснить это в ближайшее время .... – karthik

+0

Три выражения в круглых скобках являются группами захвата. Первая группа фиксирует произвольные символы, за которыми следуют 1 или 2 цифры (все до дня буквальное). Вторая группа моделирует все четыре цифры дня. Третья группа обозначает все, что приходит после буквального. В строке замены вы склеиваете группы 1 и 3. В основном вы заменяете целую строку первой частью, а третья - конкатенированной. – mtsz