У меня есть метод, с помощью которого я пытаюсь получить местный часовой пояс системы, но я всегда получаю «Всемирное координированное время» в качестве часового пояса, где я ожидаю, что это будет «Стандартное время Индии»
код, как показано ниже
Calendar c = Calendar.getInstance();
//get local TimeZone by
TimeZone timezone = c.getTimeZone();
System.out.println("Local TimeZone is : " + timezone.getDisplayName());
Пожалуйста, дайте мне знать, как получить системный часовой пояс пользователя динамически Спасибо!




Я могу динамически получать часовой пояс устройства с помощью кода ниже
Calendar c = Calendar.getInstance();
TimeZone timezone = c.getTimeZone();
TimeZone.setDefault(null);
System.out.println("Local TimeZone is : " + timezone.getDisplayName());
У меня не работает динамически. Он продолжает отображать часовой пояс ОС, который был установлен в первый раз, даже когда фрагмент запускается снова после того, как я изменил часовой пояс ОС.
Это даст местный часовой пояс:
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
Лучше, чем ничего, вы можете использовать результат как условие для печати того, что вам нужно.
Например,
ZoneId.systemDefault()... (это отjava.time).