ZoneOffset
Locale locale = new Locale( "zh" , "CN" );
ZonedDateTime zonedDateTime = ZonedDateTime.now( ZoneId.of( "America/Chicago" ) );
for ( FormatStyle formatStyle : FormatStyle.values() ) {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( formatStyle ).withLocale( locale );
String output = zonedDateTime.format( formatter );
System.out.println( "output for FormatStyle " + formatStyle + " = " + output );
}
88.<968.
TextStyle
с локализованным ZoneId#getDisplayName
Класс ZoneId
предлагает метод getDisplayName
. Этот метод принимает аргумент для TextStyle
, чтобы определить длину или сокращение.
Давайте напишем код для использования каждого из шести стилей текста.
System.out.println( "Java version: " + Runtime.version() );
System.out.println(
"tz database version: " +
java.time.zone.ZoneRulesProvider
.getVersions( "UTC" )
.lastEntry()
.getKey()
+ "\n"
);
ZoneId zoneId = ZoneId.of( "America/Chicago" );
Locale locale = Locale.US; // new Locale( "zh" , "CN" );
for ( TextStyle textStyle : TextStyle.values() ) {
String output = zoneId.getDisplayName( textStyle , locale );
System.out.println( "output for " + textStyle + " = " + output );
}
При запуске.
Java version: 17+35-2724
tz database version: 2021a
output for FULL = 北美中部时间
output for FULL_STANDALONE = 北美中部时间
output for SHORT = CT
output for SHORT_STANDALONE = CT
output for NARROW = America/Chicago
output for NARROW_STANDALONE = CT
При запуске для Locale.US
.
Java version: 17+35-2724
tz database version: 2021a
output for FULL = Central Time
output for FULL_STANDALONE = Central Time
output for SHORT = CT
output for SHORT_STANDALONE = CT
output for NARROW = America/Chicago
output for NARROW_STANDALONE = CT
FormatStyle
с DateTimeFormatter.ofLocalizedDateTime
Давайте попробуем написать код, использующий часовые пояса в действии с объектом ZonedDateTime
.
Здесь мы используем DateTimeFormatter
из ofLocalizedDateTime
для автоматической локализации нашего сгенерированного текста. Этот класс принимает аргумент FormatStyle
(не путать с TextStyle
, который мы видели выше) для определения длины и сокращения. Таким образом, мы зацикливаем все четыре объекта перечисления FormatStyle
: FULL
, LONG
, MEDIUM
и SHORT
.
.
Locale locale = new Locale( "zh" , "CN" );
ZonedDateTime zonedDateTime = ZonedDateTime.now( ZoneId.of( "America/Chicago" ) );
for ( FormatStyle formatStyle : FormatStyle.values() ) {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( formatStyle ).withLocale( locale );
String output = zonedDateTime.format( formatter );
System.out.println( "output for FormatStyle " + formatStyle + " = " + output );
}
При запуске.
output for FormatStyle FULL = 2021年8月9日星期一 北美中部夏令时间 上午12:19:42
output for FormatStyle LONG = 2021年8月9日 CDT 上午12:19:42
output for FormatStyle MEDIUM = 2021年8月9日 上午12:19:42
output for FormatStyle SHORT = 2021/8/9 上午12:19
И при запуске для Locale.US
.
output for FormatStyle FULL = Monday, August 9, 2021 at 12:20:40 AM Central Daylight Time
output for FormatStyle LONG = August 9, 2021 at 12:20:40 AM CDT
output for FormatStyle MEDIUM = Aug 9, 2021, 12:20:40 AM
output for FormatStyle SHORT = 8/9/21, 12:20 AM
Мы видим, что для обеих локалей стиль формата LONG
использует CDT
в качестве неофициального краткого названия часового пояса.
Наконец, еще раз, я рекомендую вам избегать использования этих двух-четырехбуквенных имен псевдозон везде, где это целесообразно. И при обмене данными даты и времени в виде текста никогда не локализуйте; всегда используйте форматы ISO 8601 для обмена данными.
Что именно вы ожидаете от локализованной версии этого короткого имени для
America/Chicago
?As a native Chinese speaker, I can't think of any shorter way to say "America/Chicago" than "中央夏令时".
Я рекомендую вам не использовать
TimeZone
. Этот класс плохо спроектирован и давно устарел. Вместо этого используйтеZoneId
из java.time, современный API даты и времени Java.Какое краткое название часового пояса вы ожидали в переводе? Спрашиваю после комментария @Sweeper.