web-dev-qa-db-fra.com

Java.util.Date utilise-t-il TimeZone?

J'ai 2 ordinateurs différents, chacun avec un fuseau horaire différent.

Dans un ordinateur, j'imprime System.currentTimeMillis(), puis imprime la commande suivante sur les deux ordinateurs: System.out.println(new Date(123456)); -> 123456 représente le nombre entré dans le currentTimeMillis dans l'ordinateur # 1.

La deuxième impression (bien que tapée en dur) entraîne des impressions différentes sur les deux ordinateurs. pourquoi donc?

24
Udi

Que diriez-vous d'un détail pédant.

Java.util.Date est indépendant du fuseau horaire. Dit si bien dans le javadoc.

Vous voulez quelque chose par rapport à un fuseau horaire particulier? C'est Java.util.Calendar .

La partie délicate? Lorsque vous imprimez ce truc (avec Java.text.DateFormat ou sous-classe ), cela implique un calendrier (qui implique un fuseau horaire). Voir DateFormat.setTimeZone () .

Il semble (sans vérifier l'implémentation) que Java.util.Date.toString () passe par un DateFormat. Ainsi, même notre classe (principalement) indépendante du fuseau horaire est gâchée avec les fuseaux horaires.

Vous voulez obtenir ces informations de fuseau horaire de nos objets de date sans zone pure? Il y a Date.toGMTString () . Ou vous pouvez créer votre propre SimpleDateFormatter et utiliser setTimeZone () pour contrôler la zone utilisée vous-même.

50
John M

pourquoi donc?

Parce que quelque chose comme "4 octobre 2009, 14:20" n'a pas de sens sans connaître le fuseau horaire auquel il se réfère - que vous pouvez très probablement voir en ce moment, car c'est mon heure d'écriture, et elle diffère probablement de plusieurs heures de votre temps même si c'est le même moment.

Les horodatages des ordinateurs sont généralement mesurés en UTC (essentiellement le fuseau horaire de Greenwich, en Angleterre), et le fuseau horaire doit être pris en compte lors du formatage en quelque chose de lisible par l'homme.

7

Parce que ce nombre de millisecondes est le nombre de millisecondes après le 1/1/1970 UTC. Si vous traduisez ensuite dans un fuseau horaire différent, l'heure de rendu sera différente.

par exemple. 123456 peut correspondre à midi à Greenwich (UTC). Mais ce sera un autre moment à New York.

Pour confirmer cela, utilisez SimpleDateFormat avec une sortie de fuseau horaire et/ou modifiez le fuseau horaire sur le deuxième ordinateur pour qu'il corresponde au premier.

5
Brian Agnew

javadoc l'explique bien, System.currentTimeMillis () Notez que bien que l'unité de temps de la valeur de retour soit une milliseconde, la granularité de la valeur dépend du système d'exploitation sous-jacent et peut être plus grande. Par exemple, de nombreux systèmes d'exploitation mesurent le temps en unités de dizaines de millisecondes.

2
lwpro2

Voir https://docs.Oracle.com/javase/7/docs/api/Java/util/Date.html#toString () .

Oui, il utilise des fuseaux horaires. Il doit également les imprimer (les trois caractères avant l'année).

2
svens