线上出一个特别神奇的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 偏移量改变,那么此方法就返回历史上正确的偏移值。