Неправильный часовой пояс в Java

У меня есть метод, с помощью которого я пытаюсь получить местный часовой пояс системы, но я всегда получаю «Всемирное координированное время» в качестве часового пояса, где я ожидаю, что это будет «Стандартное время Индии»

код, как показано ниже

Calendar c = Calendar.getInstance();
              
 //get local TimeZone by
TimeZone timezone = c.getTimeZone();
              
System.out.println("Local TimeZone is : " + timezone.getDisplayName());
               

Пожалуйста, дайте мне знать, как получить системный часовой пояс пользователя динамически Спасибо!

Например, ZoneId.systemDefault() ... (это от java.time).

deHaar 07.04.2021 11:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
46
3

Ответы 3

Я могу динамически получать часовой пояс устройства с помощью кода ниже

Calendar c = Calendar.getInstance();
              
TimeZone timezone = c.getTimeZone();

TimeZone.setDefault(null);

System.out.println("Local TimeZone is : " + timezone.getDisplayName());

У меня не работает динамически. Он продолжает отображать часовой пояс ОС, который был установлен в первый раз, даже когда фрагмент запускается снова после того, как я изменил часовой пояс ОС.

Ole V.V. 07.04.2021 15:20

Это даст местный часовой пояс:

import java.time.ZoneId

ZoneId zone = ZoneId.systemDefault();

Вы можете попробовать использовать java.time (все равно рекомендуется сейчас и определенно предпочтительнее java.util):

public static void main(String[] args) {
    // first, define a locale for your output
    Locale locale = Locale.ENGLISH; // you can use your system default here, too
    // then get the zone id of the system
    ZoneId sysZoneId = ZoneId.systemDefault();
    // and use one of its names (full, narrow, short) in the defined language
    String sysZoneFullName = sysZoneId.getDisplayName(TextStyle.FULL, locale);
    String sysZoneShortName = sysZoneId.getDisplayName(TextStyle.SHORT, locale);
    String sysZoneNarrowName = sysZoneId.getDisplayName(TextStyle.NARROW, locale);
    // get the offset from UTC the zone currently has
    OffsetDateTime odt = OffsetDateTime.now(sysZoneId);
    ZoneOffset sysOffset = odt.getOffset();
    // then prepare some output (could be done in a better way ;-) )
    int offsetInSeconds = sysOffset.getTotalSeconds();
    char direction = (offsetInSeconds < 0) ? '-' : '+';
    // then output each zone representation (full, narrow, short) and the offset from UTC
    System.out.printf("%s / %s / %s has an offset of %s%d hours from UTC",
            sysZoneFullName, sysZoneNarrowName, sysZoneShortName, 
            direction, offsetInSeconds / 3600);

В моей системе (расположенной в Германии) это выводит

Central European Time / Europe/Berlin / CET has an offset of +2 hours from UTC

Ознакомьтесь с различными вариантами получения имени ZoneId для вашего кода. Также существуют версии STANDALONE для каждого представления имени. Надеюсь, вы найдете то, что вам нужно.

ОБНОВИТЬ

К сожалению, IST не является представлением, предоставленным ZoneId. Вместо этого вы получите IT или India Time, если ваш systemDefault() - "Asia/Kolkata". Я попытался определить эту зону и распечатать ее представления:

public static void main(String[] args) {
    Locale locale = Locale.ENGLISH;
    ZoneId ist = ZoneId.of("Asia/Kolkata");
    System.out.println(ist.getDisplayName(TextStyle.FULL, locale));
    System.out.println(ist.getDisplayName(TextStyle.FULL_STANDALONE, locale));
    System.out.println(ist.getDisplayName(TextStyle.NARROW, locale));
    System.out.println(ist.getDisplayName(TextStyle.NARROW_STANDALONE, locale));
    System.out.println(ist.getDisplayName(TextStyle.SHORT, locale));
    System.out.println(ist.getDisplayName(TextStyle.SHORT_STANDALONE, locale));
}

и он выводит

India Time
India Time
Asia/Kolkata
IT
IT
IT

Лучше, чем ничего, вы можете использовать результат как условие для печати того, что вам нужно.

Другие вопросы по теме