Я хочу получить часовой пояс с мобильного телефона Android при нажатии кнопки.
Я хочу получить часовой пояс с мобильного телефона Android при нажатии кнопки.
Ответы:
Вы пробовали использовать TimeZone.getDefault()
:
Большинство приложений будут использовать TimeZone.getDefault (), который возвращает часовой пояс в зависимости от часового пояса, в котором запущена программа.
Ссылка: http://developer.android.com/reference/java/util/TimeZone.html
DateTimeZone.forTimeZone(TimeZone.getDefault());
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());
Выход:
TimeZone GMT + 09: 30 Timezon id :: Австралия / Дарвин
Изменить: исправлен случай
Мне нужно было смещение, которое учитывало бы не только переход на летнее время, но и числовое значение . Вот код, который я использовал на случай, если кто-то ищет пример.
Я получаю ответ «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);
Попробуйте этот код -
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Он вернет выбранный пользователем часовой пояс.
Calendar
для этого объект - нонсенс. Создание такого объекта стоит дорого. TimeZone.getDefault()
- подходящий способ получить это.
TimeZone timeZone = TimeZone.getDefault();
timeZone.getID();
Он будет напечатан как
Asia/Kolkata
Современный ответ:
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. Просто требуется как минимум Java 6 .
org.threeten.bp
подпакетов.java.time
было впервые описано.java.time
в Java 6 и 7 (ThreeTen для JSR-310).Самое простое решение с простым форматом даты: 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
Согласно http://developer.android.com/reference/android/text/format/Time.html вы должны использовать Time.getCurrentTimezone () для получения текущего часового пояса устройства.
Для устройств с API 26 и выше получить это можно так:
ZonedDateTime.now().getZone().toString();
Все ответы здесь, похоже, предлагают установить для параметра daylite значение false . Это неверно для многих часовых поясов, которые меняют сокращенные названия в зависимости от времени года (например, EST или EDT).
Приведенное ниже решение предоставит вам правильное сокращение в соответствии с текущей датой для часового пояса.
val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
TimeZone
Класс плохо разработаны и давно устарели.