Получение "разбора исключения" - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу изменить строку в формат даты, для которой я использую класс SimpleDateFormat.Я передаю строку как String+Integer.toString(int) из списка строк и SimpleDateFormat pattern в качестве входных данных.Примечание: вместо String+Integer.toString(int), если я передаю фактическую строку, такую ​​как «Jan 09 2019», успешно преобразую строку в дату.Я много пробовал с разными вещами.

dateList - список дат форматирования "MMM dd".Добавляем год к этому формату, выполняя dateList.get(5)+Integer.toString(year), что дает мне исключение синтаксического анализа << - Вместо этого, если я жестко закодирую дату, например <code>Jan 09 2019, преобразуем строку в дату.finalDatesInMMMDDYYYYFormat - это другой список, в котором я сохраняю даты в формате MMM dd yyyy.Utils.parseDate - это метод, который я написал в классе Utils, где я упомянул блок try-catch.

int year = 2019;
private List<String> dateList = new ArrayList<>();
private List<Date> finalDatesInMMMDDYYYYFormat = new ArrayList<>();
final String testString = dateList.get(5)+Integer.toString(year);
finalDatesInMMMDDYYYYFormat.add(Utils.parseDate(testString, new SimpleDateFormat("MMM dd yyyy")));

Ожидается: измените строку на дату и добавьте ее в finalDatesInMMMDDYYYYFormat

Actual: Получение исключения разбора.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

java.time

    int year = 2019;
    DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("MMM dd")
            .toFormatter(Locale.ENGLISH);

    List<LocalDate> finalDatesWithoutFormat = new ArrayList<>();

    String dateString = "JAN 09";
    MonthDay md = MonthDay.parse(dateString, dateFormatter);
    finalDatesWithoutFormat.add(md.atYear(year));

    System.out.println(finalDatesWithoutFormat);

Выходные данные этого фрагмента:

[2019-01-09]

java.timeСовременный API даты и времени Java включает в себя класс для даты без года MonthDay, который может служить вашим целям лучше обычной даты.Мой код также показывает, как указать год для получения LocalDate (дата без времени суток).

Я рекомендую не использовать Date и SimpleDateFormat.Эти классы плохо спроектированы и давно устарели, последние, в частности, заведомо хлопотны.

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

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

  • Как сказал рокфаркас в другом ответе, при конкатенации строк вы не ставили пробел между днем ​​месяца и годом, но вы форматировали строкудля синтаксического анализа требовался пробел.
  • Если, например, аббревиатуры вашего месяца написаны на английском языке, а языковой стандарт JVM по умолчанию не английский, синтаксический анализ завершится неудачно (за исключением редких случаев, когда сокращение месяца совпадает).Вы всегда должны указывать вашему форматирующему устройству локаль для указания языка, используемого в анализируемой (или производимой) строке.

Кроме того, имя вашей переменной finalDatesInMMMDDYYYYFormat вводило в заблуждение, поскольку Dateне имеет (не может иметь) формат.

Ссылки

0 голосов
/ 11 февраля 2019

Если вы хотите разобрать формат "MMM dd yyyy", вы должны добавить дополнительный пробел к вашей тестовой строке следующим образом:

final String testString = dateList.get(5) + ' ' + year;
...