Как преобразовать строковое значение даты шаблона dd-MMM-yy в объект Date шаблона Pattern dd / MM / yyyy в java - PullRequest
2 голосов
/ 26 марта 2020

У меня есть

String dateAsString = "15-May-84";

, и я хочу преобразовать его как

Date date = 15/05/1984;

первая попытка

new SimpleDateFormat("dd/MM/yyyy").format(new Date(dateAsString )), "dd/MM/yyyy")

вторая попытка

LocalDate.parse(dateAsString , DateTimeFormatter.ofPattern("dd/MM/uuuu")));

Я пробовал много способов с SimpleDateFormat и LocalDate, но он всегда возвращается 15/05/0084.

Может кто-нибудь помочь здесь, пожалуйста

Ответы [ 4 ]

2 голосов
/ 26 марта 2020

Прежде всего, не годно использовать год как две цифры в виде строки. Почему?

Объяснение

для анализа вашей даты, это просто, вы можете использовать:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yy")
        .withLocale(Locale.US);

LocalDate ld = LocalDate.parse("15-May-84", formatter);

Но

Это вернет 2084-05-15, что, я думаю, вы не смотрите на это, но вы смотрите на 1984-05-15.

Quick Fix

Таким образом, чтобы решить эту проблему, вы можете использовать команду minusYears(100):

LocalDate ld = LocalDate.parse("15-May-84", formatter).minusYears(100);

Но

, которая может быть проблемой в другие годы, например 15-May-20, которая вернет 1920-05-15 .

Для этого я вообще не советую использовать две цифры в вашем году в виде строки.

Если только

, если у вас нет другого подтверждение того, что ваша дата находится между 1900 и 1999 или между 2000 и 2999. в этом случае вы можете создать (безопасный) пользовательский парсер!


Важно

Не используйте устаревшую библиотеку Date, вместо этого используйте только современный java.time API

1 голос
/ 26 марта 2020

java .time

Я показываю вам современный способ, используя LocalDate и DateTimeFormatter beacase java .time, современный Java API даты и времени, так приятно работать с. Классы Date и SimpleDateFormat не только плохо спроектированы, но и давно устарели, поэтому я не рекомендую пробовать их.

Я предполагаю, что вы хотите дату, которая сегодня или в прошлом , а не в будущем и менее 100 лет a go.

    LocalDate today = LocalDate.now(ZoneId.of("Asia/Kolkata"));
    int thisYear = today.getYear();

    String dateAsString = "15-May-84";

    DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
            .appendPattern("d-MMM-")
            .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, thisYear - 99)
            .toFormatter(Locale.ENGLISH);
    LocalDate date = LocalDate.parse(dateAsString, dateFormatter);
    if (date.isAfter(today)) {
        // Go 100 years back
        dateFormatter = new DateTimeFormatterBuilder()
                .appendPattern("d-MMM-")
                .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, thisYear - 100)
                .toFormatter(Locale.ENGLISH);
        date = LocalDate.parse(dateAsString, dateFormatter);
    }

    System.out.println(date);

Вывод:

1984-05-15

Если вы хотите другой базовый год, просто укажите другой базовый год. И если вы можете, сделайте более строгую проверку диапазона, чтобы вы были совершенно уверены, что вы получите правильную дату для дат, близких к концу допустимого диапазона. Например, если вы анализируете дату рождения живого человека в возрасте от 18 до 80 лет, укажите это в качестве ограничения.

Что пошло не так в вашем коде?

  1. При использовании средства форматирования для При разборе вашей строки вам нужно предоставить строку шаблона формата, которая определяет формат для анализа, а не желаемый формат результата. При разборе строки с дефисами в строке шаблона формата вам нужны дефисы, а не косые черты. И кстати, вы не можете иметь LocalDate или Date в нужном вам формате. Ни LocalDate, ни Date не имеют формат. Вы можете иметь формат только в String.
  2. . Использование yyyy с SimpleDateFormat указывает, что строка даты содержит полный год, поэтому год 84 принимается за год 84 CE, 1936 год a go. uuuu с DateTimeFormatter еще строже, это означает, что год должен содержать не менее 4 цифр, поэтому не может анализировать 84.

Ссылка

Oracle учебник: Дата и время объяснение, как использовать java .time.

0 голосов
/ 26 марта 2020

Вы можете использовать приведенный ниже код для работы с различными форматами даты

    String dateAsString = "15-May-84";
    SimpleDateFormat format = new SimpleDateFormat("dd-MMMM-yy");
    SimpleDateFormat newFormat = new SimpleDateFormat("dd/MM/yyyy");
    Date date = format.parse(dateAsString);
    String newDateString = newFormat.format(date);
    System.out.println(newDateString);
0 голосов
/ 26 марта 2020

Вы можете использовать SimpleDateFormat#parse:

Date date = new SimpleDateFormat("dd/MM/yyyy").parse("26/06/2020");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...