Как преобразовать строку с форматом дд ммм гггг в объект календаря - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь преобразовать строку в формате 02 МАЯ 2019 в объект календаря.

Итак, я написал этот код:

String currentDate = "02 MAY 2019"
Date dateFormatted = new SimpleDateFormat("dd/MM/yyyy").parse(currentDate)
Calendar c = Calendar.getInstance()
c.setTime(dateFormatted)
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK)
String month = c.get(Calendar.MONTH)

Однако я получил эту ошибку:

org.codehaus.groovy.runtime.InvokerInvocationException: java.text.ParseException: непарсируемая дата: "02 мая 2019 года"

Можете ли вы помочь мне исправить это, пожалуйста? Спасибо.

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

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

Я сам попробовал и получил DateTimeParseException тоже.

Я наконец-то обнаружил некоторый код, который делает то, что вы хотите, но, похоже, требуется определенное Locale:

public static void main(String args[]) {
    String currentDate = "02 MAY 2019";
    DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .parseCaseInsensitive()
                                .parseLenient()
                                .appendPattern("dd MMM yyyy")
                                // does not work without the Locale:
                                .toFormatter(Locale.ENGLISH); 
    DateTimeFormatter dtfIso = DateTimeFormatter.ofPattern("dd/MM/yyyy");

    LocalDate d = LocalDate.parse(currentDate, dtf);
    System.out.println(d.format(dtfIso));
}

Это приводит к выводу

02/05/2019

Очевидно, что необходимо обращать внимание на порядок вызовов методов при определении DateTimeFormatter для (необычных?) Таких шаблонов. Кроме того, не предоставление Locale или предоставление отличного от Locale.ENGLISH, кажется, вызывает DateTimeParseException, я изменил его на Locale.getDefault() (GER в моем случае), и Exception был брошен, однако с Интересное сообщение, потому что с моей ошибкой критикуется индекс 4, а не 3, как раньше с вами.

2 голосов
/ 11 июня 2019

Если на Java 8, вы можете использовать ниже:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.util.Locale;

Код:

String currentDate = "02 MAY 2019";
//case insenstive parsing
DateTimeFormatter formatter =
                new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern("dd MMM yyyy").toFormatter();
LocalDate date = LocalDate.parse(currentDate, formatter);
//get directly from LocalDate what was intended from Calendar
int dayOfWeek = date.getDayOfWeek().getValue();
String month = date.getMonth().getDisplayName(TextStyle.SHORT, Locale.getDefault());
System.out.printf("dayOfWeek %d and month %s", dayOfWeek, month);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...