gpt4 book ai didi

java - joda 时区 id 与 java 时区 id 相同吗?

转载 作者:行者123 更新时间:2023-12-01 16:50:48 28 4
gpt4 key购买 nike

我在 Android 上使用 ACTION_TIMEZONE_CHANGED Intent 过滤器来响应时区更改。

我注意到 Jodas 当前时区此时没有更新,使用:DateTimeZone.getDefault()

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

注意:当我再次更改它时:Joda 具有我之前更改的值。所以它落后了(当 Android 触发广播 Intent 时尚未更新)。

所以我只能使用Java时区作为当前时区。但我的域对象使用 Joda DateTimeZone。现在我想将当前时区与域对象中的时区进行比较。这样做是否节省:

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

?或者两个库之间的时区 ID 可以不同吗?

最佳答案

tl;博士

不,假设时区不安全:

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

tzdata

大多数操作系统和软件库都依赖 tz databaseIANA 维护提供当前和过去的时区信息。也称为 tzdata 或 TZDB。以前称为奥尔森数据库

频繁更改

在世界各地,政治家喜欢频繁改变、重新定义、重新安排、重命名,以及以其他方式搞乱时区定义和规则。他们经常在没有任何预警的情况下这样做,例如Turkey现在不到两个月。 (2016 年秋季)。

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

此外,有时会给现有时区赋予新名称。例如,随着印度最近恢复其城市名称,Asia/Calcutta 现在也标记为 Asia/Kolkota。同样,旧的 tzdata 副本将不知道这个新名称。

指定proper time zone name格式为大洲/地区,如America/Montreal , Africa/Casablanca ,或太平洋/奥克兰。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

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

某些区域有 display name ,例如英国时间。但您绝对不应该将其用作标识符。

正在更新

系统管理员必须努力更新所有可能使用 tzdata 的地方:

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

JVM 提供商通常在 JVM 更新中包含最新版本的 tzdata。但政客们更频繁地摆弄时区,而不是 Java 更新。所以你可能需要手动更新JVM。 Oracle 提供 Timezone Update Tool适用于 Oracle 和 OpenJDK JVM。

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

列出已知标识符

java.time 类可以向您显示其 known zone identifiers 的列表。 .

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

其他库和操作系统也许能够执行相同的操作。

避免遗留日期时间类

与最早版本的 Java bundle 在一起的麻烦的旧日期时间类现在已被遗留,并被 java.time 类取代。

所以你使用TimeZone.getDefault()现已过时 ZoneId.systemDefault :

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

用它来获取特定区域的当前时刻。

ZonedDateTime zdt = ZonedDateTime.now( z );

关于java - joda 时区 id 与 java 时区 id 相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40548309/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com