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

给定两者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/Paris

TimeZone.getDefault().toZoneId() : Europe/Paris


青春有我
浏览 355回答 2
2回答

梵蒂冈之花

两者都返回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()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java