【发布时间】:2018-01-21 14:26:29
【问题描述】:
在 Android 上,如何根据我当前的位置获取与 UTC 的时区偏移量?我不想使用任何 3rd 方网络服务或将 tz_world 数据库包含到我的应用程序中。
如果我移动时区边界,我的手机会自动更改时间。是否有可能获得基于此的偏移量?
【问题讨论】:
在 Android 上,如何根据我当前的位置获取与 UTC 的时区偏移量?我不想使用任何 3rd 方网络服务或将 tz_world 数据库包含到我的应用程序中。
如果我移动时区边界,我的手机会自动更改时间。是否有可能获得基于此的偏移量?
【问题讨论】:
由于时区往往存在夏令时 (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 日期和时间 API java.time。有人告诉我,它内置在较新的 Android 设备上。要在旧设备上使用它,请获取 ThreeTenABP,将其添加到您的项目中,并确保从 org.threeten.bp 包中导入日期和时间类。请参阅下面的链接。
java.time。java.time。java.time 到 Java 6 和 7(JSR-310 的 ThreeTen)的反向移植。【讨论】:
试试这个
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone: "+tz.getDisplayName());
【讨论】: