Как получить эквивалент GMT, используя идентификатор TimeZone

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

Pacific/Fiji ==> должно быть GMT+13, потому что летнее время началось в воскресенье, 21 октября 2012 года. Но вместо этого я получаю GMT+12.

Ниже мой код:

public static void main(String[] args){

    String m_utcDatePattern = "yyyy-MM-dd'T'HH:mm:ss.SSS";
    String pnrCreation = "2012-12-10T01:14:22.000";

    Calendar calendar = convertDateStringToCalendar(pnrCreation, m_utcDatePattern);

    double offset = TimeZone.getTimeZone("Pacific/Fiji").getOffset(calendar.getTimeInMillis())/(60*60*1000.0);

    System.out.println("GMT+" + (int) offset);  //result is GMT+12, it should be GMT+13
}


//Date String to Calendar
public static Calendar convertDateStringToCalendar(String value, String fromPattern)     
{
       Calendar calendar;

       if (value == null)
       {
           return null;
       } 
       else 
       {
           DateFormat dateFormat = new SimpleDateFormat(fromPattern);
           Date date;
           try 
           {
               date = dateFormat.parse(value);
               calendar = Calendar.getInstance();
               calendar.setTime(date);
           } 
           catch (ParseException e) 
           {
               return null;
           }

           return calendar;
       }

}

Заранее спасибо! :-)

С уважением,
Расс


person vixenpixie14    schedule 11.12.2012    source источник
comment
Какой часовой пояс по умолчанию вы используете здесь calendar = Calendar.getInstance(); ?   -  person Peter Lawrey    schedule 11.12.2012
comment
Привет, Питер, проблема была в данных TZ на нашем сервере, они не обновлялись. Последняя версия на данный момент — «tzdata2012j».   -  person vixenpixie14    schedule 18.12.2012


Ответы (1)


В любом случае ваш код на данный момент немного сломан, но основная проблема заключается в том, что вы используете данные о старых часовых поясах.

Я не могу указать точный выпуск, в котором это изменилось прямо сейчас, но в выпуске TZDB 2012e для Фиджи было правило:

Rule    Fiji    2012    only    -   Jan 22  3:00    0   -

В версии 2012h он имел:

Rule    Fiji    2012    max -   Jan Sun>=18 3:00    0   -

(Наряду с другими соответствующими изменениями.)

Я полагаю, что Фиджи собирался отказаться от летнего времени, но в конце концов решил их сохранить.

Я не знаю, насколько просто обновить базу данных часовых поясов для «обычной» Java. Я предлагаю вам использовать Joda Time вместо этого, что позволяет использовать локально созданную версию на основе актуальных данных. Это также намного более чистый API :)

person Jon Skeet    schedule 11.12.2012
comment
@matheszabi: getOffset уже делает это. Вот почему вы должны указать момент времени. Из документации: Если в указанную дату действует летнее время, значение смещения корректируется с учетом перехода на летнее время. - person Jon Skeet; 11.12.2012
comment
Спасибо, Джон! Данные TZ на нашем сервере были обновлены до JDK 6 с последним патчем часового пояса «tzdata2012j». Еще раз спасибо за это быстрое решение. - person vixenpixie14; 18.12.2012
comment
@Racs: О, я не знал, что 2012j вышел. Теперь придется обновить Noda Time :) Рад, что разобрался с вами. - person Jon Skeet; 18.12.2012