joda时区ID与java时区ID相同吗?
我使用Android上的ACTION_TIMEZONE_CHANGED intent过滤器来响应时区更改 我注意到Jodas current timezone此时未使用以下工具进行更新:joda时区ID与java时区ID相同吗?,java,android,datetime,jodatime,Java,Android,Datetime,Jodatime,我使用Android上的ACTION_TIMEZONE_CHANGED intent过滤器来响应时区更改 我注意到Jodas current timezone此时未使用以下工具进行更新: DateTimeZone.getDefault() 当我使用Java的默认时区时,getDefault(),时区是正确的 注意:当我再次更改它时:Joda的值与我之前更改的值相同。所以它已经落后了(当Android启动广播意图时还没有更新) 因此,我只能对当前时区使用Java时区。但我的域对象使用Joda Da
DateTimeZone.getDefault()
当我使用Java的默认时区时,getDefault()
,时区是正确的
注意:当我再次更改它时:Joda的值与我之前更改的值相同。所以它已经落后了(当Android启动广播意图时还没有更新)
因此,我只能对当前时区使用Java时区。但我的域对象使用Joda DateTimeZone的。现在,我想将当前时区与域对象中的时区进行比较。这样做是否可以保存:
TimeZone currenTimeZone = TimeZone.getDefault();
if(action.getLocation().getDateTimeZone().getID().equals(currenTimeZone.getID()))) {
[...]
}
??
或者两个库之间的时区ID是否不同?tl;博士
不,不安全假设时区:
- 存在
- 已定义特定标识符
- 具有相同的定义/规则
tzdata
或TZDB
。以前称为奥尔森数据库
频繁变化
在世界各地,政客们喜欢频繁地改变、重新定义、重新安排、重命名时区定义和规则。他们这样做通常没有什么预警,比如现在(2016年秋季)不到两个月
有时会定义新的时区。因此,在这方面,请具体回答您的问题:是的,tzdata的某些副本可能具有旧副本中不存在的较新时区定义,因此可能存在时区标识符的差异
此外,有时会给现有时区起新名称。例如,随着印度最近恢复其城市名称,Asia/Calcutta
现在也被标记为Asia/Kolkota
。同样,旧的tzdata副本将不知道这个新名称
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
一些软件将扩展tzdata以尝试识别这些伪时区。这不是个好主意。但是,同样,这意味着使用这些非标准时区标识符可能在一个地方有效,但在另一个地方无效。坚持使用官方时区名称
有些区域有一个时间限制,例如英国时间。但是你不应该把它作为一个标识符
更新
系统管理员必须努力在可能使用tzdata的所有不同位置更新tzdata:
- 操作系统
- Java虚拟机
- 软件库(如Joda Time,可能还有)
ZonedDateTime zdt = ZonedDateTime.now( z );
tl;博士
不,不安全假设时区:
- 存在
- 已定义特定标识符
- 具有相同的定义/规则
tzdata
或TZDB
。以前称为奥尔森数据库
频繁变化
在世界各地,政客们喜欢频繁地改变、重新定义、重新安排、重命名时区定义和规则。他们这样做通常没有什么预警,比如现在(2016年秋季)不到两个月
有时会定义新的时区。因此,在这方面,请具体回答您的问题:是的,tzdata的某些副本可能具有旧副本中不存在的较新时区定义,因此可能存在时区标识符的差异
此外,有时会给现有时区起新名称。例如,随着印度最近恢复其城市名称,Asia/Calcutta
现在也被标记为Asia/Kolkota
。同样,旧的tzdata副本将不知道这个新名称
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
一些软件将扩展tzdata以尝试识别这些伪时区。这不是个好主意。但是,同样,这意味着使用这些非标准时区标识符可能在一个地方有效,但在另一个地方无效。坚持使用官方时区名称
有些区域有一个时间限制,例如英国时间。但是你不应该把它作为一个标识符
更新
系统管理员必须努力在可能使用tzdata的所有不同位置更新tzdata:
- 操作系统
- Java虚拟机
- 软件库(如Joda Time,可能还有)
ZoneId z = ZoneId.systemDefault() ;
String zoneIdentifier = z.toString() ;
ZonedDateTime zdt = ZonedDateTime.now( z );