【问题标题】:How can I see each permutation of `FormatStyle` for a localized `DateTimeFormatter` in Java?如何在 Java 中查看本地化的“DateTimeFormatter”的“FormatStyle”的每个排列?
【发布时间】:2017-09-11 20:34:16
【问题描述】:

当automatically localizing 时,我找不到关于FormatStyle 为DateTimeFormatter 的日期部分和时间部分设置的特定行为的文档:

DateTimeFormatter.ofLocalizedDateTime(FormatStyle dateStyle, FormatStyle timeStyle)

有没有办法知道为任何特定的Locale 生成的字符串的可能变化?

【问题讨论】:

    标签: java localization datetime-format java-time


    【解决方案1】:

    如果你想知道生成字符串的所有结果(format 方法的最终结果),那么your answer 可以很好地覆盖它。我只是在所有语言环境中添加另一个外部循环,因为不同的语言环境也可以有不同的格式样式。

    如果您想了解模式,您可以在相同的嵌套循环中使用DateTimeFormatterBuilder.getLocalizedDateTimePattern method。我还使用了values() 方法而不是EnumSet(不确定是否有区别):

    for (Locale locale : Locale.getAvailableLocales()) {
        System.out.println("--|For locale " + locale + "|-------");
        for (FormatStyle styleDate : FormatStyle.values()) {
            for (FormatStyle styleTime : FormatStyle.values()) {
                String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(styleDate, styleTime, IsoChronology.INSTANCE, locale);
                int padSpacesOutTo = 17;
                String styles = styleDate + " | " + styleTime;
                String stylesLabel = String.format("%1$-" + padSpacesOutTo + "s", styles);
                System.out.println(stylesLabel + pattern);
            }
        }
    }
    

    输出将是(取决于 JVM 中所有可用的语言环境)如下所示:

    --|For locale ar_AE|-------
    FULL | FULL      dd MMMM, yyyy z hh:mm:ss a
    FULL | LONG      dd MMMM, yyyy z hh:mm:ss a
    FULL | MEDIUM    dd MMMM, yyyy hh:mm:ss a
    FULL | SHORT     dd MMMM, yyyy hh:mm a
    LONG | FULL      dd MMMM, yyyy z hh:mm:ss a
    LONG | LONG      dd MMMM, yyyy z hh:mm:ss a
    LONG | MEDIUM    dd MMMM, yyyy hh:mm:ss a
    LONG | SHORT     dd MMMM, yyyy hh:mm a
    MEDIUM | FULL    dd/MM/yyyy z hh:mm:ss a
    MEDIUM | LONG    dd/MM/yyyy z hh:mm:ss a
    MEDIUM | MEDIUM  dd/MM/yyyy hh:mm:ss a
    MEDIUM | SHORT   dd/MM/yyyy hh:mm a
    SHORT | FULL     dd/MM/yy z hh:mm:ss a
    SHORT | LONG     dd/MM/yy z hh:mm:ss a
    SHORT | MEDIUM   dd/MM/yy hh:mm:ss a
    SHORT | SHORT    dd/MM/yy hh:mm a
    --|For locale ar_JO|-------
    FULL | FULL      dd MMMM, yyyy z hh:mm:ss a
    FULL | LONG      dd MMMM, yyyy z hh:mm:ss a
    FULL | MEDIUM    dd MMMM, yyyy hh:mm:ss a
    ... lots of output
    

    【讨论】:

      【解决方案2】:

      循环所有可能的值

      是的,您可以轻松地循环遍历可能的 FormatStyle 值。

      EnumSet

      那个类是一个enum,提供了几个预定义的对象。您可以通过调用EnumSet.allOf 来获取这些对象的集合。

      EnumSet< FormatStyle > styles = EnumSet.allOf( FormatStyle.class ) ;
      

      嵌套循环

      所以我们需要一对nested loops:一个外部循环使用每种可能的样式用于日期部分,一个内部循环使用每种可能的样式用于时间部分。

      对于日期样式和时间样式的每种组合,我们为特定的Locale 实例化一个DateTimeFormatter。

      ZonedDateTime zdt = ZonedDateTime.now( );
      System.out.println( "---|  " + zdt + "  |-------------" );
      
      Locale locale = Locale.US;
      for ( FormatStyle styleDate : EnumSet.allOf( FormatStyle.class ) )
      {
          for ( FormatStyle styleTime : EnumSet.allOf( FormatStyle.class ) )
          {
              DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( styleDate , styleTime ).withLocale( locale );
              String output = zdt.format( f );
              int padSpacesOutTo = 17 ;  // The longest possible value is "MEDIUM | MEDIUM", with a length of 15 characters.
              String styles = styleDate + " | " + styleTime ;
              String stylesLabel  = String.format("%1$-" + padSpacesOutTo + "s", styles ) ;
              System.out.println( stylesLabel + output   );
          }
      }
      

      Locale.US 的输出。

      ---|  2017-09-11T13:15:02.193544-07:00[America/Los_Angeles]  |-------------
      FULL | FULL      Monday, September 11, 2017 at 1:15:02 PM Pacific Daylight Time
      FULL | LONG      Monday, September 11, 2017 at 1:15:02 PM PDT
      FULL | MEDIUM    Monday, September 11, 2017, 1:15:02 PM
      FULL | SHORT     Monday, September 11, 2017, 1:15 PM
      LONG | FULL      September 11, 2017 at 1:15:02 PM Pacific Daylight Time
      LONG | LONG      September 11, 2017 at 1:15:02 PM PDT
      LONG | MEDIUM    September 11, 2017, 1:15:02 PM
      LONG | SHORT     September 11, 2017, 1:15 PM
      MEDIUM | FULL    Sep 11, 2017, 1:15:02 PM Pacific Daylight Time
      MEDIUM | LONG    Sep 11, 2017, 1:15:02 PM PDT
      MEDIUM | MEDIUM  Sep 11, 2017, 1:15:02 PM
      MEDIUM | SHORT   Sep 11, 2017, 1:15 PM
      SHORT | FULL     9/11/17, 1:15:02 PM Pacific Daylight Time
      SHORT | LONG     9/11/17, 1:15:02 PM PDT
      SHORT | MEDIUM   9/11/17, 1:15:02 PM
      SHORT | SHORT    9/11/17, 1:15 PM
      

      再次,使用Locale.CANADA_FRENCH。

      ---|  2017-09-11T13:32:00.434143-07:00[America/Los_Angeles]  |-------------
      FULL | FULL      lundi 11 septembre 2017 à 13:32:00 heure avancée du Pacifique
      FULL | LONG      lundi 11 septembre 2017 à 13:32:00 HAP
      FULL | MEDIUM    lundi 11 septembre 2017 13:32:00
      FULL | SHORT     lundi 11 septembre 2017 13:32
      LONG | FULL      11 septembre 2017 à 13:32:00 heure avancée du Pacifique
      LONG | LONG      11 septembre 2017 à 13:32:00 HAP
      LONG | MEDIUM    11 septembre 2017 13:32:00
      LONG | SHORT     11 septembre 2017 13:32
      MEDIUM | FULL    11 sept. 2017 13:32:00 heure avancée du Pacifique
      MEDIUM | LONG    11 sept. 2017 13:32:00 HAP
      MEDIUM | MEDIUM  11 sept. 2017 13:32:00
      MEDIUM | SHORT   11 sept. 2017 13:32
      SHORT | FULL     17-09-11 13:32:00 heure avancée du Pacifique
      SHORT | LONG     17-09-11 13:32:00 HAP
      SHORT | MEDIUM   17-09-11 13:32:00
      SHORT | SHORT    17-09-11 13:32
      

      看到这个code run live at IdeOne.com。警告:IdeOne 仅使用 Locale.US 并忽略所有其他语言环境。

      留给读者作为一个执行:疯狂并在嵌套外部添加第三个循环,用于从Locale.getAvailableLocales() 返回的数组中的每个Locale。 ……或者看看the Answer by Hugo。

      【讨论】:

        猜你喜欢
        • 2020-10-08
        • 2019-11-03
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 2018-02-08
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        相关资源
        最近更新 更多