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