Где определены константы Java 8 DateTimeFormatters?

Я смотрю на класс DateTimeFormatter и мне было интересно, где определены такие константы, как "M", "EEE" и "YY" и т. д. В частности, где-то должен быть такой код с ChronoField и TextStyle , он должен вернуть фрагмент строки DateTimeFormatter, например. (ChronoField.MONTH_OF_YEAR, TextStyle.SHORT) должен сопоставляться со строкой "MMM"


person pathikrit    schedule 09.03.2015    source источник


Ответы (2)


После некоторого поиска исходного кода я обнаружил, что они предопределены в private static final Map, называемом FIELD_MAP, который является членом DateTimeFormatBuilder:

 /** Map of letters to fields. */
private static final Map<Character, TemporalField> FIELD_MAP = new HashMap<>();
static {
    // SDF = SimpleDateFormat
    FIELD_MAP.put('G', ChronoField.ERA);                       // SDF, LDML (different to both for 1/2 chars)
    FIELD_MAP.put('y', ChronoField.YEAR_OF_ERA);               // SDF, LDML
    FIELD_MAP.put('u', ChronoField.YEAR);                      // LDML (different in SDF)
    FIELD_MAP.put('Q', IsoFields.QUARTER_OF_YEAR);             // LDML (removed quarter from 310)
    FIELD_MAP.put('q', IsoFields.QUARTER_OF_YEAR);             // LDML (stand-alone)
    FIELD_MAP.put('M', ChronoField.MONTH_OF_YEAR);             // SDF, LDML
    FIELD_MAP.put('L', ChronoField.MONTH_OF_YEAR);             // SDF, LDML (stand-alone)
    FIELD_MAP.put('D', ChronoField.DAY_OF_YEAR);               // SDF, LDML
    FIELD_MAP.put('d', ChronoField.DAY_OF_MONTH);              // SDF, LDML
    FIELD_MAP.put('F', ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);  // SDF, LDML
    FIELD_MAP.put('E', ChronoField.DAY_OF_WEEK);               // SDF, LDML (different to both for 1/2 chars)
    FIELD_MAP.put('c', ChronoField.DAY_OF_WEEK);               // LDML (stand-alone)
    FIELD_MAP.put('e', ChronoField.DAY_OF_WEEK);               // LDML (needs localized week number)
    FIELD_MAP.put('a', ChronoField.AMPM_OF_DAY);               // SDF, LDML
    FIELD_MAP.put('H', ChronoField.HOUR_OF_DAY);               // SDF, LDML
    FIELD_MAP.put('k', ChronoField.CLOCK_HOUR_OF_DAY);         // SDF, LDML
    FIELD_MAP.put('K', ChronoField.HOUR_OF_AMPM);              // SDF, LDML
    FIELD_MAP.put('h', ChronoField.CLOCK_HOUR_OF_AMPM);        // SDF, LDML
    FIELD_MAP.put('m', ChronoField.MINUTE_OF_HOUR);            // SDF, LDML
    FIELD_MAP.put('s', ChronoField.SECOND_OF_MINUTE);          // SDF, LDML
    FIELD_MAP.put('S', ChronoField.NANO_OF_SECOND);            // LDML (SDF uses milli-of-second number)
    FIELD_MAP.put('A', ChronoField.MILLI_OF_DAY);              // LDML
    FIELD_MAP.put('n', ChronoField.NANO_OF_SECOND);            // 310 (proposed for LDML)
    FIELD_MAP.put('N', ChronoField.NANO_OF_DAY);               // 310 (proposed for LDML)
}
person Konstantin Yovkov    schedule 09.03.2015

Я думаю, что нашел хак, чтобы приблизиться, не заглядывая в приватное поле, как упомянул @kocko:

String getFormat(ChornoField field, TextStyle style) {
  new DateTimeFormatterBuilder()
    .appendText(field, style)
    .toString()  // This does not actually return the pattern but close enough??
}
person pathikrit    schedule 09.03.2015
comment
Есть ли способ получить исходный шаблон с учетом DateTimeFormatter ? - person pathikrit; 09.03.2015