Як отримати TimeZone з мобільного Android?


139

Я хочу отримати часовий пояс з мобільного Android під час натискання кнопки.


11
TimeZone tz = TimeZone.getDefault (); String gmt1 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.SHORT); String gmt2 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.LONG); Log.d ("Тег", "TimeZone:" + gmt1 + "\ t" + gmt2); А це код
asha v

10
Я не був би таким грубим щодо asha v. Я просто шукав те саме, і знайдені відповіді були іншими, ніж ці. Насправді пошук за точним "TimeZone.getDefault" привів мене сюди.
Яр

Відповіді:


189

Ви намагалися використовувати TimeZone.getDefault():

Більшість додатків використовуватимуть TimeZone.getDefault (), який повертає TimeZone на основі часового поясу, в якому працює програма.

Посилання: http://developer.android.com/reference/java/util/TimeZone.html


22
Якщо ви використовуєте JodaTime , ви можете отримати DateTimeZone з наступним:DateTimeZone.forTimeZone(TimeZone.getDefault());
Джошуа Пінтер

@JoshPinter, який пакет я використовую, той на android.icu.utils або java.util?
Неонова Варга

1
Я змінив часовий пояс із пристрою на CST, він не дає мені CST назад. Чи є спосіб отримати часовий пояс пристрою?
Абхінав Саксен

Мені цікаво, чи спрацьовує TimeZone.getDefault, якщо ми якось підробляємо часовий пояс пристрою. Здається, це не на андроїд-тренажері.
Хау Луу

@NeonWarge Обидва будуть працювати, хоча android.icu працює лише для API 24 і вище.
Ніколя

136
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Вихід:

TimeZone GMT + 09: 30 Ідентифікатор Timezon :: Австралія / Дарвін


@Flexo, як отримати позначку часу від пристрою Android
KOUSIK daniel

4
чудове пояснення з результатами
Ананд Савяні


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
Це працювало для мене, коли я просто мав справу з тривалістю (як секундомір).
Аксан

13

Спробуйте цей код-

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

Він поверне вибраний користувачем часовий пояс.


4
Створення Calendarоб’єкта для цього - нісенітниця. Створення такого типу об’єктів коштує дорого. TimeZone.getDefault()це відповідний спосіб отримати це.
анонімний

3
@KrLx_roller Будь ласка, перевірте уважно, перш ніж відхиляти відповідь. У мене wrtitten моя відповідь повертає вибраний користувачем часовий пояс, тоді як TimeZone.getDefault () поверне часовий пояс установки за замовчуванням. Для отримання додаткової інформації, будь ласка, code.google.com/p/android/isissue/detail?id=2037 .
anujprashar

Ваш код повертає той же часовий пояс, що і TimeZone.getDefault () на Android 4.2. TimeZone.getDefault () поверне часовий пояс, вибраний у налаштуваннях -> дата та час.
користувач1088166


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

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.
  • У програмах, що не входять до Android Java 6 та 7, отримуйте ThreeTen Backport, опору сучасних класів (ThreeTen для JSR 310; див. Посилання внизу).
  • На (старшому) Android використовують Android-версію ThreeTen Backport. Це називається ThreeTenABP. І переконайтесь, що ви імпортуєте дати та часові класи org.threeten.bpз підпакетів.

Посилання


1

Для пристроїв з API 26 та новішими версіями ви можете отримати його так:

ZonedDateTime.now().getZone().toString();

1

На моєму пристрої TimeZone.getDefault()завжди повертається часовий пояс UTC.

Мені потрібно зробити це для налаштування користувачем часового поясу:

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

Він поверне вибраний користувачем часовий пояс.


0

Здається, всі відповіді тут пропонують встановити параметр daylite на значення false . Це невірно для багатьох часових поясів, які змінюють скорочені назви залежно від часу року (наприклад, EST проти EDT).

Наведене нижче рішення дасть вам правильну абревіатуру відповідно до поточної дати для часового поясу.

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)

TimeZoneКлас погано розроблені і давно застаріли.
Оле ВВ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.