java中时区的时令问题

        线上出一个特别神奇的bug,通过以下方式取到的时间,比真实的时间早了一个小时。处理时区的方式是:

        

public static Date converDateBaseFromGMT(Date sourceDate) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(sourceDate);
        cal.add(Calendar.MILLISECOND, -TimeZone.getTimeZone(TimeZone.getDefault().getID()).getRawOffset());
        cal.add(Calendar.MILLISECOND, TimeZone.getTimeZone("GMT+8").getRawOffset());
        return cal.getTime();
    }

        单位的服务器在国外,有夏时令的问题(比标准的时区晚一个小时)。由于缺乏生活常识,晚的一个小时并没有往这方面去想。走了颇多弯路。

        差java API 发现对getRawOffse()方法的描述:

getRawOffset

public abstract int getRawOffset()
返回添加到 UTC 以获取此时区中的标准时间的时间量(以毫秒为单位)。<strong>因为此值不受夏令时的影响,所以它称为原始偏移量</strong>。
如果底层 TimeZone 实现子类支持历史 GMT 的偏移量变化,那么此方法返回当前日期的原始偏移量值。例如,在火奴鲁鲁(美国夏威夷州的首府和港市),它的原始偏移量在 1947 年从 GMT-10:30 改变到 GMT-10:00,并且此方法始终返回 -36000000 毫秒(即 -10 小时)。

      就是被他坑了。。

      可以使用getRowSet()

getOffset

public int getOffset(long date)
从给定日期的 UTC 返回此时区的偏移量。如果夏令时在指定的日期是有效的,就用夏令时调整偏移值。
如果底层 TimeZone 实现子类支持历史夏令时安排和 GMT 偏移量改变,那么此方法就返回历史上正确的偏移值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值