Подтвердить что ты не робот

Получите значение смещения TimeZone от TimeZone без имени TimeZone

Мне нужно сохранить часовой пояс телефона в формате [+/-] hh: mm

Я использую класс TimeZone для решения этой проблемы, но единственный формат, который я могу получить, следующий:

PST -05:00
GMT +02:00

Я бы предпочел не подстроить результат, есть ли какой-либо флаг ключа или опции, который я могу установить, чтобы получить значение, а не имя этого часового пояса (GMT/CET/PST...)?

4b9b3361

Ответ 1

Мне нужно сохранить часовой пояс телефона в формате [+/-] hh: mm

Нет, нет. Недостаточно одного смещения, вам нужно сохранить все имя/идентификатор часового пояса. Например, я живу в Осло, где мое текущее смещение составляет +02: 00, но зимой (из-за ) +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());
}