如何在Java中看到本地化`DateTimeFormatter`的`FormatStyle`的每个排列?

时间:2017-09-11 20:34:17

标签: java localization datetime-format java-time

FormatStyle时,我无法找到DateTimeFormatterautomatically localizing的日期部分和时间部分设置的特定行为的文档:

DateTimeFormatter.ofLocalizedDateTime(FormatStyle dateStyle, FormatStyle timeStyle)

是否有某种方法可以了解为任何特定Locale生成的字符串的可能变体?

2 个答案:

答案 0 :(得分:1)

循环所有可能的值

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

EnumSet

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

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

嵌套循环

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

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

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

答案 1 :(得分: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