Как получить TimeZone с мобильного Android?

147

Я хочу получить часовой пояс с мобильного телефона Android при нажатии кнопки.

аша в
источник
11
Часовой пояс tz = TimeZone.getDefault (); Строка gmt1 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.SHORT); Строка gmt2 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.LONG); Log.d ("Тег", "Часовой пояс:" + gmt1 + "\ t" + gmt2); А это код
asha v
10
Я бы не стал так грубо говорить о asha v. Я просто искал то же самое, и ответы, которые я нашел, были отличны от этих. Фактически поиск по точному "TimeZone.getDefault" привел меня сюда.
Яр

Ответы:

196

Вы пробовали использовать TimeZone.getDefault():

Большинство приложений будут использовать TimeZone.getDefault (), который возвращает часовой пояс в зависимости от часового пояса, в котором запущена программа.

Ссылка: http://developer.android.com/reference/java/util/TimeZone.html

Мастер Кассим
источник
22
Если вы используете JodaTime , вы можете получить DateTimeZone со следующим:DateTimeZone.forTimeZone(TimeZone.getDefault());
Джошуа Пинтер
@JoshPinter, какой пакет я использую, тот, который находится на android.icu.utils или java.util?
Neon Warge
1
Я изменил часовой пояс с устройства на CST, он не возвращает мне CST. Есть ли способ узнать часовой пояс устройства?
Абхинав Саксена
Мне интересно, сработает ли TimeZone.getDefault, если мы каким-то образом подделаем часовой пояс устройства. Вроде нет на симуляторе андроида.
Хау Луу,
@NeonWarge Оба будут работать, хотя android.icu работает только для API 24 и выше.
Николас
139
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Выход:

TimeZone GMT + 09: 30 Timezon id :: Австралия / Дарвин

Зульфикар
источник
@Flexo, как получить метку времени с устройства Android
КОУСИК Дэниел
4
отличное объяснение с выводом
Ананд Савджани 08
14

Мне нужно было смещение, которое учитывало бы не только переход на летнее время, но и числовое значение . Вот код, который я использовал на случай, если кто-то ищет пример.

Я получаю ответ «3,5» (3:30 '), чего я ожидал бы в Тегеране, Иран зимой, и «4,5» (4:30') летом.

Мне также нужно было это в виде строки, чтобы я мог отправить ее на сервер, чтобы вам не понадобилась последняя строка.

для получения текущего часового пояса:

TimeZone tz = TimeZone.getDefault();
Date now = new Date();
//Import part : x.0 for double number
double offsetFromUtc = tz.getOffset(now.getTime()) / 3600000.0;
String m2tTimeZoneIs = Double.parseDouble(offsetFromUtc);
Аднан Абдолла Заки
источник
1
Это сработало для меня, поскольку я имел дело только с длительностями (как с секундомером).
Ahsan
13

Попробуйте этот код -

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();

Он вернет выбранный пользователем часовой пояс.

Ануджпрашар
источник
4
Создавать Calendarдля этого объект - нонсенс. Создание такого объекта стоит дорого. TimeZone.getDefault()- подходящий способ получить это.
анонимный
3
@KrLx_roller Пожалуйста, внимательно проверьте ответ, прежде чем голосовать против. Я написал, что мой ответ возвращает часовой пояс, выбранный пользователем, тогда как TimeZone.getDefault () вернет часовой пояс по умолчанию для установки. Для получения дополнительной информации code.google.com/p/android/issues/detail?id=2037 .
anujprashar 08
Ваш код возвращает тот же часовой пояс, что и TimeZone.getDefault () на android 4.2. TimeZone.getDefault () вернет часовой пояс, выбранный в настройках -> дата и время.
user1088166 06
7
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Он будет напечатан как

Asia/Kolkata
Раджа Джавахар
источник
5

ZoneId из java.time и ThreeTenABP

Современный ответ:

    ZoneId zone = ZoneId.systemDefault();
    System.out.println(zone);

Когда я запустил этот фрагмент в часовом поясе Австралии / Сиднея, результат был именно таким:

Australia/Sydney

Если вы хотите использовать название часового пояса с учетом летнего времени (DST) или его сокращение:

    DateTimeFormatter longTimeZoneFormatter = DateTimeFormatter.ofPattern("zzzz", Locale.getDefault());
    String longTz = ZonedDateTime.now(zone).format(longTimeZoneFormatter);
    System.out.println(longTz);

    DateTimeFormatter shortTimeZoneFormatter = DateTimeFormatter.ofPattern("zzz", Locale.getDefault());
    String shortTz = ZonedDateTime.now(zone).format(shortTimeZoneFormatter);
    System.out.println(shortTz);
Eastern Summer Time (New South Wales)
EST

В TimeZoneбольшинстве других ответов использовался тот же класс, что и у нас, когда вопрос задавали в 2011 году, хотя он был плохо спроектирован. Сегодня он давно устарел, и я рекомендую вместо него использовать java.time, современный API даты и времени Java, выпущенный в 2014 году.

Вопрос: Разве java.time не требует Android API 26 уровня?

java.time прекрасно работает как на старых, так и на новых устройствах Android. Просто требуется как минимум Java 6 .

  • В Java 8 и новее, а также на новых устройствах Android (начиная с уровня API 26) современный API встроен.
  • В Java 6 и 7, отличных от Android, получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старом) Android используйте Android-версию ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bpподпакетов.

Ссылки

Оле В.В.
источник
3

Самое простое решение с простым форматом даты: SimpleDateFormat ("ZZZZZ"):

 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                Locale.getDefault());
        Date currentLocalTime = calendar.getTime();

        DateFormat date = new SimpleDateFormat("ZZZZZ",Locale.getDefault());
        String localTime = date.format(currentLocalTime);
        System.out.println(localTime+ "  TimeZone   " );

==> Вывод: +05: 30

Джейдип пурохит
источник
2

На моем устройстве TimeZone.getDefault()всегда возвращается часовой пояс UTC.

Мне нужно сделать это, чтобы настроить часовой пояс пользователя:

TimeZone.setDefault(null)
val tz = TimeZone.getDefault()

Он вернет выбранный пользователем часовой пояс.

Бипи
источник
1

Для устройств с API 26 и выше получить это можно так:

ZonedDateTime.now().getZone().toString();
Мацей Беймчик
источник
1

Все ответы здесь, похоже, предлагают установить для параметра daylite значение false . Это неверно для многих часовых поясов, которые меняют сокращенные названия в зависимости от времени года (например, EST или EDT).

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

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
DummyData
источник
TimeZoneКласс плохо разработаны и давно устарели.
Ole VV