Как преобразовать дату в порядковом формате 1 марта 1994 года?

Я хочу отформатировать дату, указанную в следующем формате 1 марта 1990 года. Дата должна быть отформатирована в формате ГГГГ-ММ-ДД. У меня есть следующий код. Это дает мне неразборчивую дату. Из этого я могу понять, что это неправильный способ форматирования этой даты, поскольку это недопустимый шаблон.

public class DateFormattingTest {
    public static void main(String[] args) throws ParseException {
        String dateString = "1st March 1984";

        dateString = dateString.replaceFirst("[a-zA-Z]{2}","") ;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("d MMMM yyyy");
        Date rightNow = simpleDateFormat.parse(dateString);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = dateFormat.format(rightNow);
        System.out.println(formattedDate);
    }
}

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

Спасибо.


person benz    schedule 10.10.2014    source источник
comment
Ребята, я добавил код и обновил тему моего вопроса, если кто-то застрял в той же проблеме.   -  person benz    schedule 11.10.2014


Ответы (3)


У тебя три проблемы.

  • Во-первых, вы пытаетесь разобрать дату, используя формат YYYY-MM-DD. Это не формат ваших данных, поэтому синтаксический анализ не работает.
  • Во-вторых, вы ожидаете, что объект Date сохранит информацию о конкретном формате. Это не так. Вместо этого вы должны преобразовать один текстовый формат в Date, а затем использовать другой DateFormat (с желаемым форматом вывода) для форматирования Date в String. Date.toString() всегда будет использовать один и тот же формат, независимо от того, как вы пришли к Date.
  • В-третьих, ваш формат YYYY-MM-DD на самом деле не то, что вам нужно — вам нужен yyyy-MM-dd. YYYY — это «год недели», а DD — это «день года».

Я не знаю ни одного подхода SimpleDateFormat, который бы обрабатывал порядковую часть вашей входной строки ("1-й", "2-й" и т. д.) - вам, вероятно, придется немного поработать, чтобы удалить ее. Получив такое значение, как «1 марта 1990 года», вы можете проанализировать его с помощью SimpleDateFormat, используя шаблон d MMMM yyyy. Убедитесь, что вы правильно установили часовой пояс и локаль.

person Jon Skeet    schedule 10.10.2014
comment
Поскольку шаблон характеризуется порядковыми маркерами, являющимися первыми буквами в строке, я думаю, что их можно легко удалить с помощью dateString.replaceFirst( "[a-zA-Z]{2}", "" ) - person RealSkeptic; 10.10.2014
comment
@RealSkeptic: Да, если исходное значение считается правильным, это должно сработать.] - person Jon Skeet; 10.10.2014
comment
@RealSkeptic, я почти готов, дай мне проверить эту замену регулярного выражения. Этот сайт просто потрясающий. - person benz; 10.10.2014
comment
@JonSkeet, что вы имеете в виду в пункте 2, когда мы говорим, что Date.toString() всегда будет использовать один и тот же формат? Какой формат? - person benz; 11.10.2014
comment
@benz: указанный в Javadoc для Date.toString(). Если вы сомневаетесь, проверьте документы :) - person Jon Skeet; 11.10.2014
comment
Огромное спасибо, Джон. :) Извините, в следующий раз я сначала сошлюсь на javadoc. Огромное спасибо еще раз. - person benz; 11.10.2014

Ваша дата 1st не была включена в Java DateFormat. Если вы можете переключиться на 1 и использовать соответствующий DateFormat, синтаксический анализ Date будет работать, иначе вам нужно будет преобразовать ordinal number в number, удалив suffix. Этот может быть хорошим постом по теме, на который стоит взглянуть.

person Piyush Mattoo    schedule 10.10.2014
comment
Пиюш, что именно вы имеете в виду под преобразованием в порядковый номер? В java нет формата, заботящегося о порядковых числах. - person benz; 10.10.2014
comment
@benz: я имею в виду наоборот, преобразование порядкового номера в число. Отредактировал мой пост. - person Piyush Mattoo; 11.10.2014

Проблема в том, что ваш dateString не соответствует шаблону, указанному в вашем формате simpleDateFormat. Ожидается дата в формате YYYY-MM-DD, значение этих символов можно найти здесь.

person PeterK    schedule 10.10.2014