web-dev-qa-db-fra.com

Joda Time convertit le temps zoné de la date en millisecondes

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?

22
cianBuckley

Quelques points:

  • Vous n'avez pas besoin d'appeler 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)
  • Cependant, si l'intention est de l'imprimer en tant que chaîne de date, pourquoi passer d'abord aux millisecondes? Si vous passez le 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());
19
Matt Johnson-Pint