【问题标题】:Where are the Java 8 DateTimeFormatters constants defined?Java 8 DateTimeFormatters 常量在哪里定义?
【发布时间】:2015-03-09 16:59:07
【问题描述】:

我正在查看DateTimeFormatter 类,我想知道"M""EEE""YY" 等常量在哪里定义。更具体地说,在给定ChronoFieldTextStyle 的地方应该有这样的代码,它应该返回DateTimeFormatter 字符串sn-p,例如(ChronoField.MONTH_OF_YEAR, TextStyle.SHORT) 应该映射到字符串 "MMM"

【问题讨论】:

    标签: java java-8 datetime-format java-time


    【解决方案1】:

    经过一番源码挖掘,我发现这些都是预定义在一个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)
    }
    

    【讨论】:

      【解决方案2】:

      我想我找到了一个技巧,可以在不查看 @kocko 提到的私有字段的情况下接近:

      String getFormat(ChornoField field, TextStyle style) {
        new DateTimeFormatterBuilder()
          .appendText(field, style)
          .toString()  // This does not actually return the pattern but close enough??
      }
      

      【讨论】:

      • 在给定DateTimeFormatter 的情况下,无论如何可以得到原始模式?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2015-07-18
      • 1970-01-01
      • 2014-07-12
      相关资源
      最近更新 更多