编程语言
首页 > 编程语言> > java.time.Clock.systemDefaultZone().getZone()vs java.util.TimeZone.getDefault().toZoneId()之间的任何区别?

java.time.Clock.systemDefaultZone().getZone()vs java.util.TimeZone.getDefault().toZoneId()之间的任何区别?

作者:互联网

鉴于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

解决方法:

两者都返回JVM的默认时区(最后,Clock调用TimeZone.getDefault(),如@Kiskae’s answer中所述),但并不能保证所有调用每次都会返回相同的值.

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

>运行JVM的系统可以更改其配置.在Windows机器中,例如,这个information is read from the registry,而在Linux中,它从/ etc / localtime(通常是指向/usr/share / zoneinfo中特定文件的链接)或其他类似文件夹(它可能在每个版本/分发中有所不同) ,或通过设置TZ环境变量.如果此系统配置更改它并重新启动JVM,则代码突然开始返回不同的值
> JVM can be configured to use a different timezone,无论操作系统的配置如何.一个例子是当维护/基础设施团队改变这种配置时(故意或偶然,并且通常不告诉开发人员……)然后你的代码不再返回相同的值(并且取决于时区的所有内容都将突然间断了)
>您的应用程序(或运行相同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());

输出将是:

Europe/London
America/New_York
UTC

请注意在运行时更改默认时区的容易程度,以及所有后续调用都会受到影响.如果调用Clock.systemDefaultZone().getZone()或TimeZone.getDefault().toZoneId(),则会发生同样的情况,因为两者都使用默认时区.

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

虽然使用默认时区的方法很方便,但您必须检查代码如何依赖于它以及如果区域更改它将如何受到影响.

如果您不想依赖默认值,理想情况是使用特定时区,例如ZoneId.of(“Europe / Paris”).始终更喜欢IANA timezones names(总是采用Region / City格式,如America / New_York或Europe / Paris).
避免使用短缩写(如CET或CEST),因为它们是ambiguous and not standard.

您可以通过调用ZoneId.getAvailableZoneIds()获取可用时区列表(并选择最适合您系统的时区).

标签:java,java-8,timezone,java-time
来源: https://codeday.me/bug/20190915/1806277.html