在安卓上,如何根据我当前的位置获取与 UTC 的时区偏移量?我不想使用任何第三方 Web 服务或将数据库包含在我的应用程序中tz_world。
如果我移动 acrros 时区边框,我的手机会自动更改时间。是否可以获得由此产生的偏移量?
由于时区往往具有夏令时 (DST) 和其他异常,因此获取时区与获取 UTC 的偏移量之间存在差异。后者不仅需要一个位置,还需要一年中的时间。
获取时区的现代方法:
ZoneId timeZone = ZoneId.systemDefault();
在我的Mac上,我得到了Europe/Copenhagen
.但是,请注意,这为您提供的是JVM的时区设置。当设备的设置更改时,这不会改变。更糟糕的是,JVM 设置可能会从程序的其他部分或在同一 JVM 中运行的其他程序进行更改。只有当 JVM 重新启动时,它才会选取设备设置。
要获取 UTC 的当前偏移量,请执行以下操作:
ZoneOffset offsetFromUtc = timeZone.getRules().getOffset(Instant.now());
就我而言,我得到了+01:00
.如果您希望从一年中的其他时间偏移,请传递不同的Instant
。
我正在使用java.time
,现代Java日期和时间API。我被告知它是内置在较新的Android设备上的。要在较旧的设备上使用它,请获取ThreeTenABP,将其添加到您的项目中,并确保从org.threeten.bp
包中导入日期和时间类。请参阅下面的链接。
链接
- Oracle 教程:日期时间,介绍如何使用
java.time
。 - Java 规范请求 (JSR) 310,其中首次描述了
java.time
。 - ThreeTen Backport 项目,将
java.time
向 Java 6 和 7 的反向移植(JSR-310 为 ThreeTen )。 - ThreeTenABP,ThreeTen Backport 的安卓版
- 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。
试试这个
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone: "+tz.getDisplayName());