2017-08-21 4 views
2

Y at-il une différence entre les deux, étant donné que les deux java.time.Clock.systemDefaultZone().getZone() et java.util.TimeZone.getDefault().toZoneId() retournent la même sortie.Toute différence entre java.time.Clock.systemDefaultZone(). GetZone() vs java.util.TimeZone.getDefault(). ToZoneId()?

Par exemple ce 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()); 
    } 

} 

renvoie cette sortie

Clock.systemDefaultZone().getZone() : Europe/Paris 
TimeZone.getDefault().toZoneId() : Europe/Paris 
+1

La principale différence est que 'TimeZone' est obsolète (mais pas encore officiellement obsolète) alors que' Clock' est moderne. –

Répondre

3

deux renvoie le fuseau horaire par défaut de la machine virtuelle Java (à la fin, Clock appels TimeZone.getDefault(), comme expliqué dans @Kiskae's answer), mais il est pas garanti que tous les appels toujours retour la même valeur à chaque fois.

C'est parce que le fuseau horaire par défaut peut être modifié:

  • le système où la machine virtuelle Java est en cours d'exécution peut changer sa configuration. Dans les machines Windows, par exemple, ceci information is read from the registry, tandis que dans Linux il obtient /etc/localtime (généralement un lien vers un fichier spécifique dans /usr/share/zoneinfo) ou un autre dossier similaire (il peut varier dans chaque version/distribution), ou en définissant la variable d'environnement TZ . Si cette configuration du système le modifie et que la JVM est redémarrée, votre code commence à renvoyer différentes valeurs
  • la JVM can be configured to use a different timezone, indépendamment de la configuration du système d'exploitation. Un exemple est lorsque l'équipe maintanance/infrastructure change cette configuration (volontairement ou par accident, et généralement sans en avertir les développeurs ...) et que votre code ne renvoie plus les mêmes valeurs (et tout ce qui dépend du fuseau horaire briser soudainement)
  • votre application (ou une autre application exécutant la même JVM) appelle TimeZone.setDefault() method. Cela affectera toutes les applications en cours d'exécution dans la même machine virtuelle Java, lors de l'exécution, donc si vous exécutez ce code:

    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()); 
    

La sortie sera:

Europe/Londres
Amérique/New_York
UTC

Non Comment le fuseau horaire par défaut est-il facilement modifié au moment de l'exécution, et tous les appels suivants pour l'obtenir sont-ils affectés? La même chose se produira si vous appelez Clock.systemDefaultZone().getZone() ou TimeZone.getDefault().toZoneId(), car les deux utilisent le fuseau horaire par défaut. Comme cela modifie le fuseau horaire par défaut de la JVM, toutes les applications exécutées dans la même JVM seront affectées par celle-ci. Cela peut entraîner des erreurs inattendues difficiles à déboguer.Bien que les méthodes qui utilisent le fuseau horaire par défaut soient pratiques, vous devez vérifier comment votre code en dépend et comment il peut être affecté si la zone change.

Si vous ne voulez pas dépendre de la valeur par défaut, l'idéal est d'utiliser un fuseau horaire spécifique, tel que ZoneId.of("Europe/Paris"). Toujours préférez IANA timezones names (toujours au format Region/City, comme America/New_York ou Europe/Paris). Évitez d'utiliser les abréviations courtes (telles que CET ou CEST) car elles sont ambiguous and not standard.

Vous pouvez obtenir la liste des fuseaux horaires disponibles (et choisir celle qui correspond le mieux à votre système) en appelant le ZoneId.getAvailableZoneIds().