2009-10-04 10 views
23

J'ai 2 ordinateurs différents, chacun avec TimeZone différent.Est-ce que java.util.Date utilise TimeZone?

Dans une impression ordinateur im System.currentTimeMillis(), puis imprime la commande suivante dans les deux ordinateurs: System.out.println(new Date(123456)); -> 123456 représente le nombre est venu dans le currentTimeMillis dans l'ordinateur # 1.

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

Répondre

48

Que diriez-vous de quelques détails pédants.

java.util.Date est indépendant du fuseau horaire. Dit si juste dans le javadoc.

Vous voulez quelque chose en ce qui concerne un fuseau horaire particulier? C'est java.util.Calendar.

La partie difficile? Lorsque vous imprimez ces éléments (avec java.text.DateFormat ou subclass), cela implique un calendrier (qui implique un fuseau horaire). Voir DateFormat.setTimeZone().

Cela semble (n'a pas vérifié l'implémentation) comme java.util.Date.toString() passe par un DateFormat. Donc, même notre classe (la plupart du temps) indépendante du fuseau horaire est ratée avec les fuseaux horaires.

Voulez-vous extraire ce genre de fuseau horaire de nos objets Date purs et sans zonage? Il y a Date.toGMTString(). Ou vous pouvez créer votre propre SimpleDateFormatter et utiliser setTimeZone() pour contrôler quelle zone est utilisée par vous-même.

+0

java.util.Date est seulement un peu indépendant du fuseau horaire. Copier et coller à partir de Java SDK7 java.util.Date.toString() 'TimeZone zi = date.getZone(); if (zi! = Null) { sb.append (zi.getDisplayName (date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz } else { sb.append ("GMT"); } '' date' est un 'BaseCalendar' dont le fuseau horaire est défini sur' TimeZone.getDefaultRef() ' –

+1

Le point clé est que vous parlez de la méthode toString(). J'ai dit que je n'avais pas regardé l'implémentation de toString(), mais je pensais que cela impliquait un calendrier. Vous venez de confirmer cela. Pas de désaccord entre nous. –

+1

L'objet 'Date' fonctionne avec un membre' cdate' (qui est un 'BaseCalendar') avec un fuseau horaire. Et puis il se passe des choses dont personne ne se soucie vraiment et 'Date' se comporte comme indépendant du fuseau horaire tant que vous ne l'imprimez pas. Je ne voulais pas contredire votre réponse. –

5

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

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

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

5

pourquoi est-ce?

Parce que quelque chose comme « le 4 octobre 2009, 14h20 » n'a pas de sens sans connaître le fuseau horaire, il se réfère à - que vous pouvez probablement voir en ce moment, parce que c'est mon temps que j'écris ceci, et il diffère probablement par plusieurs heures de votre temps même si c'est le même moment dans le temps.

Les horodatages informatiques sont généralement mesurés en UTC (fondamentalement le fuseau horaire de Greenwich, Angleterre), et le fuseau horaire doit être pris en compte lors de leur formatage en quelque chose d'humain lisible.

+1

Je sais que c'est un vieux fil, mais a dû voter pour votre explication/déclaration de pourquoi la date sans fuseau horaire est sans signification. –

+1

@HelterScelter Je dois downvote la même chose. C'est comme dire que la masse n'a pas de sens sans constante de gravité. Ils ont tous les deux un sens à leur manière. –

2

javadoc explique bien, System.currentTimeMillis() Notez que si l'unité de temps de la valeur de retour est un millième de seconde, 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.

Questions connexes