除非我做错了...

我住在波兰(GMT + 2)。在撰写本文时,我们已经处于夏令时。但是,以下代码表示GMT时间偏移仅为1小时而不是2小时。

  Calendar mCalendar = new GregorianCalendar();
  TimeZone mTimeZone = mCalendar.getTimeZone();
  System.out.println(mTimeZone);
  int mGMTOffset = mTimeZone.getRawOffset();
  System.out.printf("GMT offset is %s hours", TimeUnit.HOURS.convert(mGMTOffset, TimeUnit.MILLISECONDS));


打印GMT偏移为1小时

其他时区也是如此,例如纽约,格林尼治标准时间4:

Calendar mCalendar = new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));


打印GMT偏移量是-5小时

最佳答案

您必须使用两种方法来使用TimeZone:

您可以使用以下方法检查日期是否在DaylightSaveTime中:

mTimeZone.inDaylightTime(date)


如果这是True,则必须添加

mTimeZone.getDSTSavings()


偏移量:

Calendar mCalendar = new GregorianCalendar();
TimeZone mTimeZone = mCalendar.getTimeZone();
System.out.println("TimeZone: "+mTimeZone);
int mGMTOffset = mTimeZone.getRawOffset();
if (mTimeZone.inDaylightTime(mCalendar.getTime())){
    mGMTOffset += mTimeZone.getDSTSavings();
}
System.out.printf("GMT offset is %s hours",
TimeUnit.HOURS.convert(mGMTOffset, TimeUnit.MILLISECONDS));


输出:

GMT offset is 2 hours

10-06 12:56