Хак
String dateWithSpace = "Tue, 12 May";
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("EEE, d [MMMM][MMM]")
.toFormatter(Locale.ENGLISH);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("E_d_MMMM", Locale.ENGLISH);
TemporalAccessor parsed = formatter1.parse(dateWithSpace .trim());
String formatted = formatter2.format(parsed);
System.out.println(formatted);
Вывод:
Вт_12_Мая
Проблема в том, что мы не можем представлять «вторник 12 мая» в LocalDate
. Для LocalDate
нам нужен год. Мы не можем просто принять решение о каком-то фиксированном году по двум причинам: (1) все, что мы решим, вероятно, будет неправильным и, следовательно, приведет к ошибке в нашей программе, даже если ошибка изначально не возникнет; (2) LocalDate
будет возражать против неверного дня недели, если нам не удастся выбрать год, когда 12 мая выпадает на вторник. И даже если бы мы каким-то образом принудили это, он не напечатал бы Tue
назад, а верный день недели для года, который мы выбрали. Нет другого типа, который бы держал день недели, день месяца и месяц без года.
Хорошим решением было бы выяснить, какой год является правильным. Может быть, попробуйте этот год и следующий год по очереди и сгенерируйте исключение, если ни один из них не соответствует?
Тем временем мой хак не должен выбирать какой-то конкретный тип, а просто использует неопределенный интерфейс TemporalAccessor
.
РЕДАКТИРОВАТЬ: Принимать короткие названия месяцев полностью (June
, July
, а также May
) и трехбуквенные сокращения для более длинных названий месяцев (например, Feb
, Dec
) Я использую [MMMM][MMM]
: необязательное полное имя месяца, за которым следует необязательное сокращение месяца. Поэтому один из них всегда будет совпадать, а другой игнорироваться.
Другие примеры ввода и вывода:
Wed, 1 July -> Wed_1_July
Thu, 27 Aug -> Thu_27_August
Mon, 8 Feb -> Mon_8_February
К вашему коду
У меня есть несколько комментариев, большинство из них второстепенные:
- Вам не нужно
parseCaseInsensitive()
для вашего примера строки (возможно, для других строк, которые вы можете получить, я не могу знать). - РЕДАКТИРОВАТЬ : Чтобы принять один ди git день месяца, поместите всего одну
d
в строку шаблона формата для разбора. Он по-прежнему будет принимать две цифры тоже. Далее решите, хотите ли вы, чтобы в выходных данных всегда были две цифры или только одна ди git для первых 9 дней месяца. - Предпочитайте
MMM
над LLL
в шаблоне формата для анализа. LLL
для случая, когда месяц не является частью даты (в некоторых языках разница в том, какую форму имени месяца использовать). - Для форматирования тоже используйте
MMM
для сокращения месяца , не M/L
. - Укажите языковой стандарт для форматирования.