Получите значение смещения TimeZone от TimeZone без имени TimeZone
Мне нужно сохранить часовой пояс телефона в формате [+/-] hh: mm
Я использую класс TimeZone для решения этой проблемы, но единственный формат, который я могу получить, следующий:
PST -05:00
GMT +02:00
Я бы предпочел не подстроить результат, есть ли какой-либо флаг ключа или опции, который я могу установить, чтобы получить значение, а не имя этого часового пояса (GMT/CET/PST...)?
Ответы
Ответ 1
Мне нужно сохранить часовой пояс телефона в формате [+/-] hh: mm
Нет, нет. Недостаточно одного смещения, вам нужно сохранить все имя/идентификатор часового пояса. Например, я живу в Осло, где мое текущее смещение составляет +02: 00, но зимой (из-за dst) +01: 00. Точный переход между стандартным и летним временем зависит от факторов, которые вы не хотите исследовать.
Итак, вместо хранения + 02:00
(или должен быть + 01:00
?) я сохраняю "Europe/Oslo"
в моей базе данных. Теперь я могу восстановить полную конфигурацию, используя:
TimeZone tz = TimeZone.getTimeZone("Europe/Oslo")
Хотите узнать, каково мое смещение часового пояса сегодня?
tz.getOffset(new Date().getTime()) / 1000 / 60 //yields +120 minutes
Однако то же самое в декабре:
Calendar christmas = new GregorianCalendar(2012, DECEMBER, 25);
tz.getOffset(christmas.getTimeInMillis()) / 1000 / 60 //yields +60 minutes
Достаточно сказать: сохранить имя или идентификатор часового пояса, и каждый раз, когда вы хотите отображать дату, проверьте, какое текущее смещение (сегодня), а не сохраняйте фиксированное значение. Вы можете использовать TimeZone.getAvailableIDs()
для перечисления всех поддерживаемых идентификаторов часовых поясов.
Ответ 2
@MrBean. Я был в похожей ситуации, когда мне приходилось звонить стороннему веб-сервису и передавать в текущее время часовой пояс Android-устройство в формате +/- hh: mm. Вот мое решение:
public static String getCurrentTimezoneOffset() {
TimeZone tz = TimeZone.getDefault();
Calendar cal = GregorianCalendar.getInstance(tz);
int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
return offset;
}
Ответ 3
Теперь, используя java8, вы можете использовать
Integer offset = ZonedDateTime.now().getOffset().getTotalSeconds();
чтобы получить текущее системное смещение по времени от UTC. Затем вы можете преобразовать его в любой формат. Нашел это полезным для моего дела.
Пример: https://docs.oracle.com/javase/tutorial/datetime/iso/timezones.html
Ответ 4
ZoneId here = ZoneId.of("Europe/Kiev");
ZonedDateTime hereAndNow = Instant.now().atZone(here);
String.format("%tz", hereAndNow);
даст вам стандартизованное строковое представление типа "+0300"
Ответ 5
Я знаю, что это старо, но я решил, что дам свой вклад. Я должен был сделать это для проекта на работе, и это было моим решением.
У меня есть объект Building, который включает Timezone с использованием класса TimeZone и хотел создать поля zoneId и offset в новом классе.
Итак, я создал:
private String timeZoneId;
private String timeZoneOffset;
Затем в конструкторе я передал объект Building и задал следующие поля:
this.timeZoneId = building.getTimeZone().getID();
this.timeZoneOffset = building.getTimeZone().toZoneId().getId();
Таким образом, timeZoneId может быть похож на "EST"
И timeZoneOffset может равняться примерно как -05: 00 "
Я бы не хотел, чтобы вы не могли
Ответ 6
Мы можем легко получить миллисекундное смещение TimeZone
только с экземпляром TimeZone
и System.currentTimeMillis()
. Затем мы можем конвертировать из миллисекунд в любую единицу времени, используя класс TimeUnit
.
Вот так:
public static int getOffsetHours(TimeZone timeZone) {
return (int) TimeUnit.MILLISECONDS.toHours(timeZone.getOffset(System.currentTimeMillis()));
}
Или, если вы предпочитаете новый API Java 8 time
public static ZoneOffset getOffset(TimeZone timeZone) { //for using ZoneOffsett class
ZoneId zi = timeZone.toZoneId();
ZoneRules zr = zi.getRules();
return zr.getOffset(LocalDateTime.now());
}
public static int getOffsetHours(TimeZone timeZone) { //just hour offset
ZoneOffset zo = getOffset(timeZone);
TimeUnit.SECONDS.toHours(so.getTotalSeconds());
}