如何使用 TimeZone ID 获取 GMT 等效值

Posted

技术标签:

【中文标题】如何使用 TimeZone ID 获取 GMT 等效值【英文标题】:How to get the GMT equivalent using TimeZone ID 【发布时间】:2012-11-28 23:53:05 【问题描述】:

我想使用 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;
       


提前致谢! :-)

问候, 种族

【问题讨论】:

您在此处使用的默认时区是什么calendar = Calendar.getInstance(); 嗨彼得,问题出在我们服务器中的 TZ 数据中,它没有更新。现在的最新版本是“tzdata2012j”。 【参考方案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 :)

【讨论】:

@matheszabi:getOffset 已经做到了。这就是为什么你必须指定一个时间点。来自文档:“如果夏令时在指定日期生效,则偏移值将根据夏令时进行调整。” 谢谢乔恩!我们服务器中的 TZ 数据已使用最新的时区补丁“tzdata2012j”更新到 JDK 6。再次感谢这个快速的解决方案。 @Racs:哦,我不知道 2012j 已经过时了。现在我必须更新 Noda Time :) 很高兴为您解决了问题。

以上是关于如何使用 TimeZone ID 获取 GMT 等效值的主要内容,如果未能解决你的问题,请参考以下文章

来自区域 ID 的 GMT 时区

如何在 Android 设备中使用 GMT 获取时区格式?

java: timezone getTimeZone("GMT-0700")' 时区使用日光不正确

JAVA "GMT+10" 和 "GMT+0010"

如何将设备 GMT 时间添加到特定时间?

在 Java 中获取 GMT 时间