Перевести название часового пояса с помощью JAVA API часового пояса

avatar
Vikash Kumar
9 августа 2021 в 04:04
106
2
2

В следующем коде:

import java.util.*;
public class HelloWorld{

     public static void main(String []args){
        Locale locale = new Locale("zh","CN");
        TimeZone zone = TimeZone.getTimeZone("America/Chicago");
        String displayNameShort = zone.getDisplayName(true, TimeZone.SHORT, locale);
        System.out.println("Short time zone name - " + displayNameShort);
        String displayNameLong = zone.getDisplayName(true, TimeZone.LONG, locale);
        System.out.println("Long time zone name - " + displayNameLong);
     }
}
Output - 
Short time zone name - CDT // Not translated
Long time zone name - 中央夏令时 // Translated

Я могу перевести полное отображаемое название часового пояса, но не могу перевести аббревиатуру часового пояса.

Источник
Basil Bourque
9 августа 2021 в 04:53
0

Что именно вы ожидаете от локализованной версии этого короткого имени для America/Chicago?

Sweeper
9 августа 2021 в 05:16
1

As a native Chinese speaker, I can't think of any shorter way to say "America/Chicago" than "中央夏令时".

Ole V.V.
9 августа 2021 в 07:55
0

Я рекомендую вам не использовать TimeZone. Этот класс плохо спроектирован и давно устарел. Вместо этого используйте ZoneId из java.time, современный API даты и времени Java.

Ole V.V.
9 августа 2021 в 17:43
0

Какое краткое название часового пояса вы ожидали в переводе? Спрашиваю после комментария @Sweeper.

Ответы (2)

avatar
Basil Bourque
9 августа 2021 в 05:11
3

Имена псевдочасовых поясов

Эти 2-4-буквенные имена "кратких часовых поясов" на самом деле не являются названиями реальных часовых поясов. Они не стандартизированы. Они даже не уникальны!

Примеры:

  • "CST" = "Центральное стандартное время" (Америка) и "Стандартное время Китая"
  • "IST" = "Стандартное время Индии" и "Стандартное время Ирландии"

Поскольку официального определения нет, я не понимаю, как можно ожидать локализованную версию.

Придерживайтесь использования имен часовых поясов в реальном времени в формате Continent/Region, таких как Africa/Tunis, America/Chicago и Pacific/Auckland.

java.time классы: ZoneId и ZoneOffset

Класс TimeZone является частью ужасных классов даты и времени, связанных с самыми ранними версиями Java, такими как Date и Calendar. Несколько лет назад они были вытеснены современными классами java.time, определенными в JSR 310.

Класс TimeZone был заменен классами ZoneId и 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 для обмена данными.

avatar
Ayham-Abdur-Rahman
9 августа 2021 в 04:54
0

CDT означает центральное летнее время.

Думаю, ярлык не переведен (поскольку не во всех языках для записи используются буквы).