FormatStyle
时,我无法找到DateTimeFormatter
为automatically localizing的日期部分和时间部分设置的特定行为的文档:
DateTimeFormatter.ofLocalizedDateTime(FormatStyle dateStyle, FormatStyle timeStyle)
是否有某种方法可以了解为任何特定Locale
生成的字符串的可能变体?
答案 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