Преобразование часового пояса "Америка / Лос-Анджелес" в "PST" или "PDT" в Java ME - PullRequest
5 голосов
/ 02 февраля 2011

Мой сервер отправляет мне часовые пояса в формате «Америка / Лос-Анджелес».На клиенте у меня есть время, которое мне нужно отобразить в этом часовом поясе.Ответ будет «PST» или «PDT», в зависимости от перехода на летнее время в данный момент.Как мне сделать это преобразование?

Я на Java ME (Blackberry 4.7, если быть точным), поэтому я не могу использовать Joda Time.

Мне нужно будет сделать этот расчетбыстро для большого числа дат (но только для одного часового пояса), поэтому я не могу просто заставить сервер отправить мне смещение, потому что смещение может изменяться в зависимости от даты.

Редактировать: Позвольте мне переформулировать проблему, потому что, кажется, есть некоторая путаница.Мне дают имя зоны информации и дату.Я хочу знать смещение от GMT в этом часовом поясе на эту дату.Ответ будет варьироваться в зависимости от летнего времени.

В качестве дополнительного бонуса я бы хотел, чтобы TLA показывался пользователю (т. Е. "PST" или "PDT"), но это вторично.

Решение: Я кратко изложу решение здесь, потому что оно не очень ясно из ответов ниже.По сути, это делает то, что мне нужно, в J2ME:

TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles");
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(zone);

calendar.setTime(new Date(2011, 1, 1, 12, 0, 0));      
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND)));
calendar.setTime(new Date(2011, 6, 1, 12, 0, 0));
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND)));

Ответы [ 2 ]

7 голосов
/ 02 февраля 2011

Может быть, это то, что вы хотите. Это работает на моей машине с использованием стандартного Java.

        Calendar calendar = Calendar.getInstance();       
        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
        calendar.setTimeZone(tz);
         System.out.println("Offset from UTC="+tz.getOffset(calendar.getTimeInMillis())/(60*60*1000)); //prints -8
        System.out.println(tz.getDisplayName(Boolean.TRUE, 0)); //prints PDT
        System.out.println(tz.getDisplayName(Boolean.TRUE, 1)); //prints Pacific Daylight Time
        System.out.println(tz.getDisplayName(Boolean.FALSE, 0));//prints PST
        System.out.println(tz.getDisplayName(Boolean.FALSE, 1));//prints Pacific Standard Time  

Обновление : OP сказал, что выше не работает для j2ME. После поиска в Google я нашел здесь , что getOffset () на самом деле является getRawOffset () в j2me. Однако это не похоже на то, что оно поддерживает displayName. Я думаю, что единственный вариант - просмотреть идентификаторы, используя getAvailableIds () .

.
1 голос
/ 02 февраля 2011

J2ME не поддерживает TimeZone.getTimeZone(id)? Это в основном то, что вы хотите, для получения смещения часового пояса и т. Д. Я надеюсь, что J2ME поддерживает имена зон zoneinfo.

...