2

我想使用 TimeZone id 示例获取 GMT 等效值:

太平洋/斐济 ==> 应该是 GMT+13,因为 DST 于 2012 年 10 月 21 日星期日开始。但是,我得到的是 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;
       }

}

提前致谢!:-)

问候,
拉克斯

4

1 回答 1

3

无论如何,您的代码目前有点损坏,但根本问题是您使用的是旧时区数据。

我无法确定现在更改的确切版本,但在 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 :)

于 2012-12-11T12:25:10.657 回答