java-получить TimeZone из ID

Для получения смещения часового пояса Сингапура, если я попробую «Сингапур» в качестве идентификатора, я получу правильный, как показано ниже:

TimeZone timeZone = TimeZone.getTimeZone("Singapore");
    int offset = timeZone.getRawOffset();//It prints 28800000 which is correct

Но если попробовать SGT вместо Сингапура, как показано ниже, будет возвращено смещение по Гринвичу, потому что он не понимает SGT как идентификатор:

TimeZone timeZone = TimeZone.getTimeZone("SGT");
    int offset = timeZone.getRawOffset();//It prints 0 which is incorrect and should be 28800000 

Любой способ получить правильное смещение для Сингапура, используя «SGT» вместо «Сингапур»????

Вышеуказанный выпуск не производится для идентификатора "Америка/Лос-Анджелес". "PST" и "America/Los_Angeles" возвращают одинаковое смещение.

С уважением

ОТРЕДАКТИРОВАНО--

Если у меня есть дата типа "2015-02-08 11:18 SGT", то ?????

Я все еще не могу получить смещение «Сингапура», используя указанную выше дату?

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


person S Singh    schedule 07.02.2015    source источник
comment
2-4-буквенные коды, такие как PST, CST, IST, не являются настоящими часовыми поясами. Имена часовых поясов в реальном времени имеют формат Continent/Region, например Asia/Singapore.   -  person Basil Bourque    schedule 23.01.2020


Ответы (2)


Не все трехбуквенные идентификаторы поддерживаются, как указано в документах:

Для совместимости с JDK 1.1.x также поддерживаются некоторые другие трехбуквенные идентификаторы часовых поясов (например, "PST", "CTT", "AST"). Однако их использование не рекомендуется [...]

person duckstep    schedule 07.02.2015

Как говорит @duckstep, поддерживаются только несколько коротких имен.

Итак, вы должны использовать Asia/Singapore, например:

Код:

TimeZone timeZone = TimeZone.getTimeZone("Asia/Singapore");
System.out.println(timeZone.getID());
System.out.println(timeZone.getRawOffset());
System.out.println(timeZone.getDisplayName(false, TimeZone.LONG));
System.out.println(timeZone.getDisplayName(false, TimeZone.SHORT));
System.out.println(timeZone.getDisplayName(true, TimeZone.LONG));
System.out.println(timeZone.getDisplayName(true, TimeZone.SHORT));

Вывод:

Asia/Singapore
28800000
Singapore Time
SGT
Singapore Summer Time
SGST
person Paul Vargas    schedule 07.02.2015
comment
Можем ли мы получить результат как Asia/Singapore, когда мы даем TimeZone.getTimeZone("SGT")? - person Varshini; 25.07.2017