Получить оригинальный шаблон String с учетом JDK 8 DateTimeFormatter?

Связанный с моим вопросом здесь - как мне получить оригинал pattern Строка дана DateTimeFormatter?

3 ответа

Решение

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

В той же ветке предлагается использовать DateTimeFormatterBuilder который имеет информацию.

Это может быть не прямой ответ на ваш вопрос, но это может помочь.

Если вы знаете параметры того, как он был построен, вы можете вызвать статический метод:

DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle dateStyle, FormatStyle timeStyle, Chronology chrono, Locale locale)

Это даст вам шаблон в виде строки.

Не прямое или изящное решение, но использование результатов DateTimeFormatter"s .toString() Метод, возможно, будет возможно свернуть ваш собственный код, который анализирует результирующую строку и восстанавливает исходный шаблон.

Некоторый код, который печатает несколько .toString() результаты для различных моделей:

java.time.format.DateTimeFormatter variousFormatPatterns =
    java.time.format.DateTimeFormatter.ofPattern("yy MM dd");
System.out.println("Test 1: " + variousFormatPatterns.toString() );

variousFormatPatterns = java.time.format.DateTimeFormatter.ofPattern("yy-MM-dd");
System.out.println("\nTest 2: " + variousFormatPatterns.toString() );

variousFormatPatterns = java.time.format.DateTimeFormatter.ofPattern("yyMMdd");
System.out.println("\nTest 3: " + variousFormatPatterns.toString() );

variousFormatPatterns = java.time.format.DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
System.out.println("\nTest 4: " + variousFormatPatterns.toString() );

Результаты (обратите внимание на сохранение символов пробела / дефиса / косой черты / двоеточия):

Тест 1: значение ReducedValue(YearOfEra,2,2,2000-01-01)' 'Value(MonthOfYear,2)' ' (DayOfMonth,2)

Тест 2: ReducedValue(YearOfEra,2,2,2000-01-01)'-' Значение (MonthOfYear,2)'-' Значение (DayOfMonth,2)

Тест 3: значение ReducedValue (YearOfEra, 2,2,2000-01-01) (MonthOfYear, 2) Значение (DayOfMonth,2)

Тест 4: значение (MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)': "Значение (SecondOfMinute,2)

Реализация этого подхода потребует изучения кода в java.time.format.DateTimeFormatterBuilder, JavaDoc для appendPattern(String pattern) Метод представляется особенно полезным. Возможно, вам удастся воспользоваться некоторыми сочетаниями клавиш, если вы знаете, что работаете только с несколькими типами паттернов.

Беглый взгляд через DateTimeFormatterBuilder код, вероятно, будет риск полагаться на этот тип решения, как строки, такие как Value, ReducedValue, Fractionи т. д. могут измениться без предварительного уведомления в будущих версиях Java.

Другие вопросы по тегам