2015-09-01 2 views
1

У меня есть две даты, которые необходимо отформатировать, но я получаю следующее исключение. Моя основная проблема связана с th rd etc в дневной части. Я не мог найти ответа на этот вопрос. Я проверил все эти ссылки 1, 2, 3, 4, 5 Я думаю, что я должен использовать Regex, но не знаю, как это сделать.Как форматировать несложную дату в Java?

10th Dec 2019 -> 2019-12-10 
10th December 2019 -> 2019-12-10 

Код

String date1 = "10th Dec 2019"; 
Date date = new SimpleDateFormat("dd MMMM YYYY").parse(date1); 
System.err.println(date); 
String date2 = new SimpleDateFormat("yyyy-mm-dd").format(date); 
System.err.println(date2); 

Исключение

Exception in thread "main" java.text.ParseException: Unparseable date: "10th Dec 2019" 
+0

Вы используете Java 8 или Java 7? – RealSkeptic

+0

У этого уже есть ответ. См. Это http://stackoverflow.com/a/6987802/1737819 – Willmore

+0

@RealSkeptic Я использую 7 – Jack

ответ

5

Заменить весь ожидаемый нежелательный sufiixes пустой строки, а затем разобрать:

String s = "10th Dec 2019"; 

    SimpleDateFormat fmt = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH); 
    Date d = fmt.parse(s.replaceFirst("th|nd|st|rd", "")); 
    System.out.println("d = " + d); 
+0

Как я могу использовать Regex? – Jack

+0

В моем ответе используется регулярное выражение. replaceFirst() принимает регулярное выражение и заменяет первую совпадающую подстроку вторым аргументом. –

+0

Как насчет даты синтаксического анализа ** 10 августа 2019 г. **? – Willmore

0

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

Date date = new SimpleDateFormat("dd'th' MMMM YYYY").parse(date1);.

Однако это решение не поддерживает подстановочные знаки, которые, как я полагаю, вам понадобятся для суффиксов «st» и «nd». Поэтому я предлагаю вам выполнить предварительную обработку ввода на основе регулярного выражения, чтобы удалить суффикс «st/nd/th».

0

Для вашей строки вы можете использовать:

Date date = new SimpleDateFormat("dd'th' MMMM YYYY").parse(date1); 
+0

Проблема с 1-го, 12-го и т. Д. – Jack

+0

@Jack '12th' не является проблемой, а 1-й не запрашивается в вашем вопросе. вы должны добавить его. – Jens

2

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

Что-то, как это будет работать:

String[] input = {  "10th Dec 2019", 
         "10th December 2019", 
         "1st December 2019", 
         "3rd December 2019" 
       }; 

DateFormat df = new SimpleDateFormat("dd MMMM yyyy"); 
DateFormat result = new SimpleDateFormat("dd-MM-yyyy"); 
for(String s : input) { 
    s = s.replaceAll("^(\\d+).{2}", "$1"); //The .{2} will match any two characters, which should be the th, st, nd and rd. 
    System.out.println(result.format(df.parse(s))); 
} 

Урожайность:

10-12-2019 
10-12-2019 
01-12-2019 
03-12-2019 
-1

Вы можете попробовать этот способ:

String suffix = getSuffix(inputDate.get(Calendar.DAY_OF_MONTH)); 
DateFormat dateFormat = new SimpleDateFormat(" d'" + suffix + "' MMMM yyyy"); 
return dateFormat.format(currentCalDate.getTime()); 

// getSuffix 
private String getSuffix(int inputDay) { 
    if (day >= 11 && day <= 13) { 
     return "th"; 
    } 
    switch (day % 10) { 
     case 1: 
      return "st"; 
     case 2: 
      return "nd"; 
     case 3: 
      return "rd"; 
     default: 
      return "th"; 
    } 
} 
+0

Суффикс можно просто заменить вместо добавления суффикса в DateFormat. Это проще и чище для этой проблемы. –

0

В Java 7, это concidered лучшие практики использования Joda time для обработки дат. Поэтому я рекомендую вам изучить его. Апи проще использовать тогда Date. (Анализ также)

Когда вы перейдете на Java 8, пакет java.time (JSR-310) основан на Joda Time, поэтому вам будет легко перемещаться во времени.

+0

На самом деле, java.time вдохновлен Joda-Time, но не основан на нем. Понятия в основном совпадают, но ваш код может значительно отличаться. Лучше всего начинать с java.time, если на Java 8 или новее. –

+0

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

Смежные вопросы