为了账号安全,请及时绑定邮箱和手机立即绑定

java.time.Clock.systemDefaultZone()之间有什么区别?

java.time.Clock.systemDefaultZone()之间有什么区别?

青春有我 2019-11-03 04:04:43
给定两者java.time.Clock.systemDefaultZone().getZone()和java.util.TimeZone.getDefault().toZoneId()返回相同的输出,两者之间是否有任何区别。例如此代码import java.time.Clock;import java.util.TimeZone;public class Main {  public static void main(String[] args) {    System.out.println("Clock.systemDefaultZone().getZone() : "         + Clock.systemDefaultZone().getZone());    System.out.println("TimeZone.getDefault().toZoneId() : "         + TimeZone.getDefault().toZoneId());  }}返回此输出Clock.systemDefaultZone().getZone() : Europe/ParisTimeZone.getDefault().toZoneId() : Europe/Paris
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

两者都返回JVM的默认时区(最后,Clock调用TimeZone.getDefault(),如@Kiskae的答案所述),但是不能保证所有调用每次总是返回相同的值。


这是因为可以更改默认时区:


运行JVM的系统可以更改其配置。例如,在Windows计算机中,此信息是从注册表中读取的,而在Linux中,它是从/etc/localtime(通常是指向中特定文件的链接/usr/share/zoneinfo)或另一个类似文件夹(在每个版本/发行版中可能不同)获取的,或者通过设置TZ环境变量。如果此系统配置对其进行了更改,并且重新启动了JVM,则您的代码突然开始返回不同的值

可以将 JVM 配置为使用不同的时区,而与OS的配置无关。一个示例是,维护/基础架构团队更改了此配置(有意或无意间,并且通常没有告诉开发人员...),然后您的代码不再返回相同的值(并且所有与时区有关的内容都将返回)突然休息)

您的应用程序(或另一个运行相同JVM的应用程序)调用TimeZone.setDefault()method。这将影响运行时在同一JVM 中运行的所有应用程序,因此,如果运行以下代码:


TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

System.out.println(ZoneId.systemDefault());


TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));

System.out.println(ZoneId.systemDefault());


TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

System.out.println(ZoneId.systemDefault());

输出将是:


欧洲/伦敦

美国/纽约

UTC


请注意,在运行时更改默认时区有多么容易,并且所有后续获取默认时区的调用都会受到影响。如果您呼叫Clock.systemDefaultZone().getZone()或TimeZone.getDefault().toZoneId(),则会发生相同的情况,因为两者都使用默认时区。


由于这会更改JVM的默认时区,因此在同一JVM中运行的所有应用程序都将受到它的影响。这可能会导致难以调试的意外错误。


尽管使用默认时区的方法很方便,但是您必须检查代码如何依赖于时区,以及如果时区发生变化,对代码的影响。


如果您不想依赖默认值,则理想的情况是使用特定的时区,例如ZoneId.of("Europe/Paris")。始终喜欢使用IANA时区名称(始终采用格式Region/City,如America/New_York或Europe/Paris)。避免使用简短的缩写(例如CET或CEST),因为它们是模棱两可的并且不是标准的。


您可以致电来获得可用时区的列表(并选择最适合您的系统的时区)ZoneId.getAvailableZoneIds()。



查看完整回答
反对 回复 2019-11-04
  • 2 回答
  • 0 关注
  • 354 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信