Quelqu'un peut-il m'expliquer pourquoi lorsque j'essaye d'obtenir les millisecondes d'un DateTime avec une zone différente de la mienne, cela me rend les millisecondes du fuseau horaire de ma machine locale? Je cherche à obtenir les millisecondes d'UTC, mais mes paramètres locaux de l'application sont définis sur EST (même si je suis en fait en Irlande;))
Voici le code:
DateTimeFormatter format = DateTimeFormat.mediumDateTime();
DateTime local = new DateTime();
DateTime utc = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC);
System.out.println("utc zone = " +utc.getZone());
System.out.println("UTC time: " + utc);
long current = utc.getMillis();
System.out.println("current: " + format.print(current));
System.out.println("local: " + format.print(local.getMillis()));
Voici ce qu'il imprime:
utc zone = UTC
UTC time: 2013-08-16T13:36:32.444Z
current: Aug 16, 2013 9:36:32 AM
local: Aug 16, 2013 9:36:32 AM
Actuellement, j'aurais pensé qu'il devrait avoir la même date et l'heure UTC?
Quelques points:
System.currentTimeMillis()
. Passez juste ceci: DateTime utc = new DateTime(DateTimeZone.UTC);
Lorsque vous appelez .getMillis()
le résultat est toujours en UTC. Représenter le temps comme un entier qui n'est pas basé sur UTC est une mauvaise idée, et non quelque chose que Joda Time fournira. Votre évaluation selon laquelle les millisecondes sont affectées par votre fuseau horaire local est incorrecte.
Les erreurs de conversion sont dues à la façon dont vous appelez format.print
. Lorsque vous transmettez un entier, le comportement par défaut consiste à utiliser le fuseau horaire actuel, qui est votre heure locale. Vous pouvez le changer comme ceci:
format.withZone(DateTimeZone.UTC).print(current)
DateTime
d'origine, ses informations de fuseau horaire seront appliquées automatiquement. format.print(utc)
format.print(local)
Ensemble, le tout ressemblerait à ceci:
DateTime local = new DateTime();
DateTime utc = new DateTime(DateTimeZone.UTC);
System.out.println("local zone = " + local.getZone());
System.out.println(" utc zone = " + utc.getZone());
DateTimeFormatter format = DateTimeFormat.mediumDateTime();
System.out.println(" local: " + format.print(local));
System.out.println(" utc: " + format.print(utc));
System.out.println("millis: " + utc.getMillis());