2016-11-11 23 views
0

我在Android上使用ACTION_TIMEZONE_CHANGED意图过滤器来响应时区更改。乔达时区IDS是否与JAVA时区ID相同?

我注意到,Jodas当前时区是不会在这个时候使用更新: DateTimeZone.getDefault()

当我使用Java的默认TimeZone.getDefault(),正确的时区。

注意:当我再次更改:乔达有我改变它之前的价值。所以它落后了(Android在启动广播意图时尚未更新)。

所以我只能使用当前时区的Java时区。但是我的域对象使用Joda DateTimeZone的。现在我想比较当前的时区和我的域对象中的时区。难道要这样做:

TimeZone currenTimeZone = TimeZone.getDefault(); 
if(action.getLocation().getDateTimeZone().getID().equals(currenTimeZone.getID()))) { 
[...] 
} 

? 或者两个库的时区id可以不同吗?

+0

如果您想要更有帮助的答案,请编辑您的问题以包括具体的问题值。 –

回答

5

TL;博士

不,不是安全承担时区:

  • 存在。
  • 具有定义的特定标识符。
  • 具有相同的定义/规则。

的tzdata

大多数操作系统和软件库依赖于IANA维护提供当前和过去的时区信息tz database。也被称为tzdataTZDB。以前称为奥尔森数据库

变动频繁

在世界各地,政治家喜欢经常改变,重新定义,重新安排,重命名,并在其他时区的定义和规则瞎搞。他们经常这样做,只有很少的预警,比如现在在Turkey(2016年秋季)的两个月内。

有时会定义新的时区。因此,在这方面,要专门回答您的问题:是的,tzdata的某些副本可能具有较旧的时区定义,这些定义在较旧的副本中不存在,因此可能存在时区标识符的差异。

此外,新名称有时会给现有时区。例如,印度最近恢复了他们的城市名称,Asia/Calcutta现在也被标记为Asia/Kolkota。再次,老tzdata副本不会知道这个新的名字。

continent/region的格式指定一个proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母缩写,如ESTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

某些软件会扩展tzdata以尝试识别这些伪时区。不是一个好主意。但是,这又意味着使用这些非标准时区标识符可能在一个地方工作,而不是另一个地方。坚持使用官方时区名称。

某些区域有display name,例如British Time。但你应该从来没有使用它作为标识符。

更新

系统管理员必须在所有可能使用的各种场所,以更新的tzdata的努力:

  • 操作系统
  • Java虚拟机
  • 软件库(例如作为Joda-Time,可能还有ThreeTen-Backport)。

JVM的提供者通常在更新JVM时包含最新版本的tzdata。但是政客们比Java更新更频繁地使用时区。所以你可能需要手动更新JVM。 Oracle为Oracle提供Timezone Update Tool & OpenJDK JVM。

Joda-Time包含自己的tzdata副本。因此,您需要更新Joda-Time库或手动更换tzdata。请注意,Joda-Time项目现在处于维护模式,并建议转移到Java 8及更高版本捆绑的java.time类。

列出已知标识符

的java.time类可以告诉你他们的known zone identifiers的列表。

Set<String> zoneIds = ZoneId.getAvailableZoneIds() ; 

其他图书馆和操作系统也许能够做到这一点。

与Java的早期版本中捆绑避免遗留日期时类

麻烦的旧日期,时间类现在是传统,由java.time类取代。

所以你的TimeZone.getDefault()使用,现在由ZoneId.systemDefault过时:

ZoneId z = ZoneId.systemDefault() ; 
String zoneIdentifier = z.toString() ; 

使用来获得当前时刻的特定区域。

ZonedDateTime zdt = ZonedDateTime.now(z);