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

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

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

PST -05:00
GMT +02:00

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

Ответы на вопрос(2)

Решение Вопроса

Нет, нет. Смещения само по себе недостаточно, вам нужно хранить полное имя / идентификатор часового пояса. Например, я живу в Осло, где мое текущее смещение составляет +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() для перечисления всех поддерживаемых идентификаторов часовых поясов.

 Mr Bean09 июл. 2012 г., 18:57
Нет, я взаимодействую с API, каким бы хорошим или плохим он ни был. Давай не будем вдаваться в это. Они требуют, чтобы я отправил часовой пояс, например, чч: мм только .... нет, я знаю.
 Tomasz Nurkiewicz09 июл. 2012 г., 18:59
@ MrBean: по стечению обстоятельств я показал вам, что делать: если у вас уже естьTimeZone класс, просто позвониgetOffset() с текущей датой и конвертируйте ее из миллисекунд в минуты. Затем отформатируйте вhh:mm.
 djule527 мар. 2013 г., 16:23
Это был именно тот ответ, который я искал, очень хорошо представлен, спасибо!
 Tomasz Nurkiewicz13 авг. 2012 г., 10:03
@ johnvdenley: пожалуйста, задайте отдельный вопрос, не стесняйтесь размещать ссылку для продолжения здесь.
 johnvdenley13 авг. 2012 г., 05:15
Большое обновление Томаш, однако, я могу попросить вас немного расширить. Я храню дату в Базе данных на сервере как UTC (очевидно), и я сохраняю свое имя TZ (в вашем примере «Европа / Осло») также в Базе данных на сервере. Я хочу передать дату обратно клиенту с примененным правильным смещением. Должен ли я (могу ли я?) Сделать это, или я должен передать дату и смещение отдельно? Проблема в том, что я использую GWT на клиенте, поэтому я не могу использовать java.util.TimeZone и поэтому не могу конвертировать "Europe / Oslo" как com.google.gwt.i18n.shared.TimeZone.createTimeZone ("Europe / Oslo" ) не работает !!

@ MrBean - у меня была похожая ситуация, когда мне приходилось вызывать сторонний веб-сервис и передавать текущее смещение часового пояса устройства Android в формате +/- чч: мм. Вот мое решение:

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;
} 

Ваш ответ на вопрос