Невозможно проанализировать дату, используя DateTimeFormatter - PullRequest
0 голосов
/ 21 мая 2019

Я попытался посмотреть на эту ссылку для вдохновения: Анализ порядкового индикатора даты (st, nd, rd, th) в строке даты и времени

Однако я получаю сообщение об ошибке при попытке разобрать строку «Пн 21 мая» в «Понедельник 21 мая» - полное имя дня, номер даты и полный месяц.

Исключение в потоке "main" java.time.format.DateTimeParseException: Текст «Пн 21 мая» не может быть проанализирован с индексом 0 в java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1949) в java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1851) в java.time.LocalDate.parse (LocalDate.java:400) в HelloWorld.main (HelloWorld.java:45)

Вот код:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.text.SimpleDateFormat;  
import java.util.Date;  
import java.util.Locale;

// one class needs to have a main() method
public class HelloWorld
{
  // arguments are passed using the text field below this editor
  public static void main(String[] args) throws Exception
  {

    String str = "Mon 21st May";
    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEEE d['st']['nd']['rd']['th'] MMMM", Locale.ENGLISH);
    LocalDate datetext = LocalDate.parse(str, parseFormatter);

  }
}

UPDATE

Вот последний код, который я попробовал, следуя предложениям, и я изменил строку, чтобы увидеть, связана ли проблема с этим, и ниже есть ошибка, которую я сейчас получаю. Похоже, он знает даты, но не может их проанализировать:

  public static void main(String[] args) throws Exception
  {

    String str = "Tue 21st May";
    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEE d['st']['nd']['rd']['th'] MMMM", Locale.ENGLISH);
    LocalDate datetext = LocalDate.parse(str, parseFormatter);

  }
}

Ошибка:

Исключение в потоке "main" java.time.format.DateTimeParseException: Не удалось проанализировать текст «21 мая»: невозможно получить LocalDate от TemporalAccessor: {DayOfWeek = 2, DayOfMonth = 21, MonthOfYear = 5}, ISO введите java.time.format.Parsed at java.time.format.DateTimeFormatter.createError (DateTimeFormatter.java:1920) в java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1855) в java.time.LocalDate.parse (LocalDate.java:400) в HelloWorld.main (HelloWorld.java:26) Причина: java.time.DateTimeException: невозможно получить LocalDate от TemporalAccessor: {DayOfWeek = 2, DayOfMonth = 21, MonthOfYear = 5}, ISO введите java.time.format.Parsed at java.time.LocalDate.from (LocalDate.java:368) в java.time.format.Parsed.query (Parsed.java:226) в java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1851) ... еще 2

Ответы [ 2 ]

4 голосов
/ 21 мая 2019

MonthDay

Если вы хотите разобрать месяц и день месяца без года, используйте MonthDay:

    String str = "Mon 21st May";
    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEE d['st']['nd']['rd']['th'] MMMM", Locale.ENGLISH);
    MonthDay md = MonthDay.parse(str, parseFormatter);
    System.out.println(md);

Вывод:

- 05-21

Первая черта указывает на отсутствующий год. EEEE в строке шаблона формата - полное имя дня недели, например, понедельник или вторник. Для сокращения вам понадобится либо E, EE, либо EEE.

.

LocalDate

Если вы хотите LocalDate, вам нужно как-то указать год. Один из вариантов:

    LocalDate datetext = md.atYear(Year.now(ZoneId.of("Europe/London")).getValue());
    System.out.println(datetext);

2019-05-21

Это не подтверждает день месяца. Для этого:

    String str = "Tue 21st May";
    DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
            .appendPattern("EEE d['st']['nd']['rd']['th'] MMMM")
            .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.of("Europe/London")).getValue())
            .toFormatter(Locale.ENGLISH);

    LocalDate datetext = LocalDate.parse(str, parseFormatter);

2019-05-21

В комментарии вы спросили:

А если я хочу вывести его во вторник, 21 мая?

Это своего рода новый вопрос, который неоднократно обсуждался, но все в порядке.

    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("EEEE d MMMM", Locale.ENGLISH);
    System.out.println(datetext.format(outputFormatter));

вторник, 21 мая

Определение года по дню недели

Возможно, я не знаю год, так как я пытаюсь просмотреть даты в заявка, но некоторые даты могут быть в этом году, некоторые могут быть перенесены на в следующем году, но у этих дат нет года

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

    String str = "Wed 20th May";
    ZoneId zone = ZoneId.of("Europe/London");
    LocalDate today = LocalDate.now(zone);
    int currentYear = today.getYear();
    LocalDate datetext = null;
    final int maxYearsFromToday = 3;
    for (int year = currentYear; year <= currentYear + maxYearsFromToday; year++) {
        DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
                .appendPattern("EEE d['st']['nd']['rd']['th'] MMMM")
                .parseDefaulting(ChronoField.YEAR, year)
                .toFormatter(Locale.ENGLISH);

        try {
            datetext = LocalDate.parse(str, parseFormatter);
            System.out.println("Day of week matched for year " + year);
            break;
        } catch (DateTimeParseException dtpe) {
            // Ignore, try next year
        }
    }

    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("EEEE d MMMM", Locale.ENGLISH);
    if (datetext == null) {
        System.out.println("Could not parse date;"
                + " possibly the day of week didn’t match for any year in the range "
                + currentYear + " through " + (currentYear + maxYearsFromToday));
    } else if (datetext.isBefore(today) || datetext.isAfter(today.plusYears(maxYearsFromToday))) {
        System.out.println("Date is out of range");
    } else {
        System.out.println("Successfully parsed: " + datetext.format(outputFormatter));
    }
Day of week matched for year 2020
Successfully parsed: Wednesday 20 May
1 голос
/ 21 мая 2019

Это Вторник 21 мая 2019 года. Приведенный ниже код работает.

    String str = "Tue 21st May 2019";
    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEE d['st']['nd']['rd']['th'] MMMM yyyy", Locale.ENGLISH);
    LocalDate datetext = LocalDate.parse(str, parseFormatter);
...