Is there any difference in between the two, given that both java.time.Clock.systemDefaultZone().getZone()
and java.util.TimeZone.getDefault().toZoneId()
return the same output.
For instance this code
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());
}
}
returns this output
Clock.systemDefaultZone().getZone() : Europe/Paris
TimeZone.getDefault().toZoneId() : Europe/Paris
Both returns the JVM's default timezone (in the end,
Clock
callsTimeZone.getDefault()
, as explained in @Kiskae's answer), but it's not guaranteed that all calls will always return the same value everytime.That's because the default timezone can be changed:
/etc/localtime
(usually a link to a specific file in/usr/share/zoneinfo
) or another similar folder (it can vary in each version/distribution), or by setting theTZ
environment variable. If this system configuration changes it and the JVM is restarted, suddenly your code starts returning different valuesyour application (or another application running the same JVM) calls
TimeZone.setDefault()
method. This will affect all the applications running in the same JVM, at runtime, so if you run this code:The output will be:
Note how easily the default timezone is changed at runtime, and all subsequent calls to get it are affected. The same will happen if you call
Clock.systemDefaultZone().getZone()
orTimeZone.getDefault().toZoneId()
, because both uses the default timezone.As this changes the JVM's default timezone, all applications running in the same JVM will be affected by it. This might lead to unexpected errors that are hard to debug.
Although the methods that use the default timezone are convenient, you must check how your code depends on it and how it can be affected if the zone changes.
If you don't want to depend on the default, the ideal is to use a specific timezone, such as
ZoneId.of("Europe/Paris")
. Always prefer IANA timezones names (always in the formatRegion/City
, likeAmerica/New_York
orEurope/Paris
). Avoid using the short abbreviations (likeCET
orCEST
) because they are ambiguous and not standard.You can get a list of available timezones (and choose the one that fits best your system) by calling
ZoneId.getAvailableZoneIds()
.Looking at the source code on grepcode, they end up executing the exact same methods, resulting in the same result.
Clock.systemDefaultZone()
callsZoneId.systemDefault()
, which returnsTimeZone.getDefault().toZoneId()
:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/time/ZoneId.java#ZoneId.systemDefault%28%29