14

如何在 Java 中获取特定日期和时区与 GMT 的时差?

确定特定时区是否处于 DST 非常简单:

boolean isIsraelInDST = TimeZone.getTimeZone("Israel").inDaylightTime(new Date());

我如何获得实际的时差?

4

5 回答 5

23

使用 TimeZone.getRawOffset():返回添加到 UTC 以获取此时区的标准时间的时间量(以毫秒为单位)。因为这个值不受夏令时影响,所以称为原始偏移量

如果您想要包含 DST 的偏移量,则使用 TimeZone.getOffset(long date)。您应该为方法提供具体日期,例如现在 - System.currentTimeMillis()

于 2013-04-03T13:40:25.197 回答
14
于 2018-02-26T05:23:09.307 回答
13

我建议将夏季/冬季时间偏移添加到 getRawOffset:

    TimeZone tz1 = TimeZone.getTimeZone("GMT");
    TimeZone tz2 = TimeZone.getTimeZone("America/New_York");
    long timeDifference = tz1.getRawOffset() - tz2.getRawOffset() + tz1.getDSTSavings() - tz2.getDSTSavings();
于 2014-06-06T17:59:04.817 回答
8

我看到这是一个旧线程 - 但添加这个是因为我最近有类似的要求 - 这给出了基于当前时间的实际毫秒差异(来自纪元的毫秒)。

    TimeZone.getTimeZone("America/New_York").getOffset(Calendar.getInstance().getTimeInMillis())
于 2014-05-05T11:41:10.990 回答
3
public String timeZone(Date date) {
    TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
    long millis = timeZone.getRawOffset() + (timeZone.inDaylightTime(date) ? timeZone.getDSTSavings() : 0);

    return String.format("%s%s:%s",
            millis < 0 ? "-" : "+",
            String.format("%02d", Math.abs(TimeUnit.MILLISECONDS.toHours(millis))),
            String.format("%02d", Math.abs(TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))))
    );
}
于 2015-05-19T10:41:23.073 回答