JDK 中的和类有什么区别

据我研究,TimeZone是旧时区类别,ZoneId是新时区类别。将来会ZoneId替换吗? 如果是,为什么不标记为TimeZoneTimeZone@Deprecated

是否有更多有关两者之间差异的信息来帮助我决定在我的项目中应该使用哪个类?

4

  • 2
    TimeZone未被弃用,因为DateCalendar不是。TimeZone仍用于Calendar。 它们应该被弃用吗? 也许,但 Oracle 选择不弃用(还没有?)。 至于使用哪一个 –java.time如果可以选择,就使用 。 添加它是有原因的。


    – 

  • @RobSpoor 谢谢,这很有道理。如果旧 API 足够好,就不需要新的设计了。哈哈


    – 

  • 但我认为“旧 API ”还不够好:-| … 而 ZoneId 可能旨在成为“新设计的一部分


    – 


  • 投票重新开放。为什么因为需要关注而关闭?这个问题集中在 Java 提供两个类的特定问题上,这两个类的功能完全相同:表示时区。询问两者的区别很聪明……而且重点很明确。


    – 



最佳答案
2

所有“旧”的时间相关类型(java.util.Calendar等)仍然存在,而且可能永远不会被弃用,因为太多java.util.Date代码依赖它们。如果这些类型被整体弃用(而不仅仅是其中特别糟糕的部分,例如构造函数),我怀疑这会导致大量弃用警告(而且迁移工作量会非常大),以至于几乎所有公司都会关闭或忽略警告,而不是迁移到java.util.TimeZoneDate(int, int, int)java.time

但是,对于任何代码(或者至少是整个新项目),最好使用java.time和相关包来处理与处理时间有关的所有事情ZoneId– 包括使用而不是TimeZone

1

  • 1
    有用的信息。感谢您解释为什么旧包未被弃用。我已在项目中将 ZoneId 与新包一起使用。


    – 

使用ZoneId、避免TimeZone

你说:

java.util.TimeZoneJDK 中的和类有什么区别java.time.ZoneId

现代的 遗产

该类java.util.TimeZone是存在严重缺陷的旧版日期时间类的一部分。请避免使用旧版类。仅使用java.time类,仅使用或其子类

旧版类java.util.TimeZone具有其替代类所不具备的一项功能:更改 JVM 当前默认时区的能力。请参阅

一般来说,更改 JVM 当前的默认时区是一个冒险的举动,因为它会立即影响在该 JVM 中运行的所有应用程序的所有线程中的所有代码。而且,在大多数情况下,您可以并且应该编写代码以明确使用您希望/期望的特定时区。依赖 JVM 当前的默认时区是一种赌博。

你说:

据我研究,TimeZone 是旧的时区类,而 ZoneId 是新的时区类。

是的,ZoneId取代TimeZone

将来 ZoneId 会取代 TimeZone 吗?

通过以来,就已经有了

  • 使用java.time.ZoneId
  • 避免java.util.TimeZone

唯一的例外是设置 JVM 的当前默认时区。但如上所述,这通常是不必要的,而且可能是一个糟糕的解决方案。

时区数据

顺便说一句,世界各地的政客都表现出了破坏各自时区规则的倾向。规则变化频繁得令人惊讶,有时几乎没有任何警告。

如果您的利益相关者关注的任何时区发生变化,您必须:

  • 替换JVM 中的ZoneId 。两者都TimeZone从该文件中获取其时区规则数据。
  • 替换主机操作系统中的tzdata以供非 Java 应用程序使用。
  • 等数据库引擎中包含的tzdata替换

弃用

如果是,为什么 TimeZone 没有标记为 @Deprecated?

据报道,遗留类在 OpenJDK 代码库中曾被标记为弃用。然后又神秘地取消了标记。

在回答中所解释的惊慌失措

从逻辑上讲,应该正式弃用旧版日期时间类。鉴于 Java 中的弃用机制已得到改进,已区分了仅弃用和弃用(最终删除)两种情况,因此更应如此。

但这种弃用不太可能。不过,您应该考虑将旧版日期时间类有效弃用。

区域与偏移

与 UTC 的偏移仅仅是比 UTC 时间子午线早或晚的小时-分钟-秒数。

时区的意义远不止于此。时区是特定地区的人们所使用的偏移量的过去、现在和未来变化的命名历史,由该地区的政治家决定。

时区 抵消

2

  • 感谢您在此处提供的非常有价值的信息。 JDK 提供了 的两个实现类java.time.ZoneIdZoneOffsetZoneRegion。 的实例可以使用常量、方法或方法ZoneOffset获取或创建。 相反,只能通过方法间接创建。 有关将创建哪种类型的实例的详细信息,请参阅ZoneOffset.UTCZoneId.of(...)ZoneOffset.of(...)ZoneRegionZoneId.of(...)


    – 

  • 除了你提到的(命名偏移量变化历史、政治)之外,时区的含义还包括区域信息(同一个偏移量可以有不同的区域,例如 UTC+8 有新加坡、上海)和文化习俗(例如夏令时)。 这些区域细节和夏令时都由 提供ZoneRegion。 相反,如果对象是 的实例ZoneOffset,则它仅表示偏移量本身,而没有其他附加信息。


    –