微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

考虑到夏令时,如何获得实时时区偏移量?

如何解决考虑到夏令时,如何获得实时时区偏移量?

我现在在 +3 时区。
现在 UTC 时间是 16:30 而在我这里是 19:30

我发现了一个问题,即时区 America/Los_Angeles

理论上是 -8 (rawOffset) 我得到了意想不到的时间。 我预计如果在我的地方 20:00,那么在这个 timezoe 时间应该少 11 小时 (8+3) 但在现实生活中,由于夏令时,它比我的地方少 10 小时。

如果我的代码中有 America/Los_Angeles zoneId,我如何获得 -7 偏移量?

TimeZone.getTimeZone("America/Los_Angeles").getRawOffset()/(3600*1000)

返回 -8 但现在它与 UTC 相差 7 小时

enter image description here

解决方法

如果您需要知道为 DST 正确调整的时区偏移量,请不要使用 getRawOffset(),因为这特别是没有 DST 的偏移量。正如文档所说:

返回要添加到 UTC 以获取此时区中的标准时间的时间量(以毫秒为单位)。由于该值不受夏令时的影响,因此称为原始偏移

要知道 DST 是否有效,系统需要知道日期,而不仅仅是时间。如果您知道完整的日期/时间,那么您可以通过调用例如获取偏移量getOffset(long date)

要使时区偏移立即生效,请调用:

int offset = TimeZone.getTimeZone("America/Los_Angeles")
                     .getOffset(System.currentTimeMillis());
int minutes = offset / 60000;

使用 Java 8 Time API,等效代码为:

ZoneOffset offset = ZoneId.of("America/Los_Angeles")
                          .getRules().getOffset(Instant.now());
int minutes = offset.getTotalSeconds() / 60;
,

java.time

answer by Andreas 是正确的。此答案提供了使用现代日期时间 API 的解决方案。

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*,它于 2014 年 3 月作为 Java SE 8 标准库的一部分发布。

使用 java.time(现代日期时间 API)的解决方案:

import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        ZoneOffset offset = ZonedDateTime.now(ZoneId.of("America/Los_Angeles")).getOffset();
        System.out.println(offset);
    }
}

输出:

-07:00

ONLINE DEMO

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。