2010-01-21 5 views
9

J'ai une instance de Java qui semble utiliser un fuseau horaire complètement incorrect. Au lieu d'utiliser le fuseau horaire Australie/Sydney que Windows utilise, il utilise le fuseau horaire Amérique/Caracas.java incorrect timezone

J'ai d'abord vérifié l'heure de Windows via l'horloge système, puis vérifié HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ et ControlSet001, ControlSet002. Tous sont définis sur un fuseau horaire de Sydney.

Est-ce que quelqu'un sait s'il s'agit d'un bug dans Java, ou si cela fait référence à une heure définie ailleurs?

Java version 1.6.0_06

+0

Dans les temps anciens, j'ai vu une JVM qui pensait que le fuseau horaire "MET" dans OS/2 n'était pas le fuseau horaire moyen-européen mais le fuseau horaire moyen-oriental. Il m'a fallu un moment pour comprendre pourquoi toutes les dates étaient de 3,5 heures de congé. –

Répondre

11

Assurez-vous de définir le fuseau horaire de la machine virtuelle Java lors du démarrage de l'application:

-Duser.timezone="Australia/Sydney" 
+0

Espérait une solution appropriée, mais a fini par aller avec cette solution de contournement. –

+0

et si je veux mettre à UTC? –

+0

-Duser.timezone = "UTC" –

2

Essayez dans votre application pour obtenir fuseau horaire par défaut, ou fuseau horaire défini manuellement (ligne commentée).

Petit exemple de la mine:

import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 
import java.util.TimeZone; 

public class Main { 
    public static void main(String[] args) { 
     Locale locale = Locale.getDefault(); 
     TimeZone localTimeZone = TimeZone.getDefault(); 
     //TimeZone localTimeZone = TimeZone.getTimeZone("Australia/Sydney"); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale); 
     dateFormat.setTimeZone(localTimeZone); 
     Date rightNow = new Date(); 
     System.out.println(locale.toString() + ": " + dateFormat.format(rightNow)); 
    } 
} 
+0

Merci les gars, je me demande cependant _why_ Je devrais spécifier manuellement le fuseau horaire. Ne devrait-il pas être le même que l'OS? –

+0

BTW, le code ci-dessus renvoie les paramètres régionaux corrects, mais le fuseau horaire incorrect. –

+0

Il devrait être. Vous pouvez essayer de mettre à jour Java vers la version la plus récente, au cas où il y aurait un bug. – balent

2

J'ai eu le même problème récemment, apparemment cela est dû à une ambiguïté de la façon dont Windows représente ses paramètres de fuseau horaire dans le registre et que Java ne parvient pas à l'interpréter correctement.

Plus de détails peuvent être trouvés dans this article, qui décrit aussi « remèdes » pour la machine concernée:

  • Modification de la date/heure, puis changer manuellement au bon moment d'origine.
  • Modification du fuseau horaire, puis retour à l'original.
  • Demande de mise à jour automatique de l'heure à partir du serveur de temps.
+0

Nous avons eu le même problème avec Java 7 après la mise à niveau vers Windows Server 2008. Modifier le fuseau horaire du système et ensuite le restaurer a résolu le problème pour nous. –

0

J'ai eu la même erreur, alors que je mettais mon fuseau horaire à Péninsule Malaise heure normale, la machine virtuelle Java m'a donné fuseau horaire heure Venezuela.

Le correctif suivant fonctionne pour moi:

Dans l'éditeur de registre, modifier votre fuseau horaire à un autre fuseau horaire (je tentais de mettre un autre texte comme « Time Singapour » Vous pouvez trouver le registre ici:.

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/TimeZoneInformation

et puis, je réinitialiser revenir à mon fuseau horaire souhaité à l'aide Panneau de configuration, réglage de la date et de l'heure. Quand je vérifie revenir à l'éditeur de registre, je peux le voir est revenue à l'heure normale de la péninsule malaise et ma machine virtuelle la lit correctement à présent...

1

Il existe une histoire de tels problèmes qui vont et viennent, et aucune solution raisonnable. Voir plus ici: Java incorrect time zone bug on Windows

Edit: Répondre Tom et francis: En bref, l'exécution Java a du mal à faire le travail de trouver correctement la zone heure actuelle sur l'ordinateur.

Les informations de registre Windows sur les fuseaux horaires ont été peu fiables, et la même chose pour l'API Windows native qui repose sur msvcrt.dll et divers msvcrxx.dll. Il existe également une API Managed (.NET) qui nécessite l'installation d'une certaine version de .NET Framework qui contredit la portabilité de Java.

Ainsi, les développeurs de Java Runtime ont du mal avec le fuseau horaire actuel sous Windows, et cela peut continuer jusqu'à ce que Microsoft ait des raisons de coopérer.

Si vous voulez que votre application Java fonctionne correctement dans n'importe quel fuseau horaire, donnez aux utilisateurs la possibilité de corriger le fuseau horaire via l'interface graphique.

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – Tom