Je dois forcer toutes les opérations liées au temps à GMT / UTC, quel que soit le fuseau horaire défini sur la machine. Un moyen pratique de le faire dans le code?
Pour clarifier, j'utilise l'heure du serveur DB pour toutes les opérations, mais elle est formatée selon le fuseau horaire local.
Merci!
Réponses:
L'OP a répondu à cette question pour modifier le fuseau horaire par défaut pour une seule instance d'une JVM en cours d'exécution, définissez la
user.timezone
propriété système:Si vous devez définir des fuseaux horaires spécifiques lors de la récupération d'objets Date / Heure / Horodatage à partir d'une base de données
ResultSet
, utilisez la deuxième forme desgetXXX
méthodes qui prend unCalendar
objet:Ou, en définissant la date dans un PreparedStatement:
Celles-ci garantiront que la valeur stockée dans la base de données est cohérente lorsque la colonne de base de données ne conserve pas les informations de fuseau horaire.
Les classes
java.util.Date
etjava.sql.Date
stockent l'heure réelle (millisecondes) en UTC. Pour les formater lors de la sortie vers un autre fuseau horaire, utilisezSimpleDateFormat
. Vous pouvez également associer un fuseau horaire à la valeur à l'aide d'un objet Calendar:Référence utile
https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html
la source
Aussi si vous pouvez définir le fuseau horaire JVM de cette façon
ou
-Duser.timezone=GMT
dans les arguments JVM.la source
System.setProperty("user.timezone" ...)
ne fonctionne pas.J'ai dû définir le fuseau horaire JVM pour Windows 2003 Server car il renvoyait toujours GMT pour la nouvelle date ();
-Duser.timezone=America/Los_Angeles
Ou votre fuseau horaire approprié. Trouver une liste de fuseaux horaires s'est avéré aussi un peu difficile ...
Voici deux listes;
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm
la source
Vous pouvez changer le fuseau horaire en utilisant TimeZone.setDefault () :
la source
pour moi, rapide SimpleDateFormat,
puis formatez la date avec un fuseau horaire différent.
la source
Je récupérerais l'heure de la base de données sous une forme brute (horodatage long ou date de java), puis utiliserais SimpleDateFormat pour le formater, ou Calendar pour le manipuler. Dans les deux cas, vous devez définir le fuseau horaire des objets avant de l'utiliser.
Voir
SimpleDateFormat.setTimeZone(..)
etCalendar.setTimeZone(..)
pour plus de détailsla source
tl; dr
Évitez de dépendre du système d'exploitation hôte ou de la JVM pour le fuseau horaire par défaut
Je vous recommande d'écrire tout votre code pour indiquer explicitement le fuseau horaire souhaité / attendu. Vous n'avez pas besoin de dépendre du fuseau horaire par défaut actuel de la JVM. Et sachez que le fuseau horaire par défaut actuel de la JVM peut changer à tout moment pendant l'exécution, avec n'importe quel code dans n'importe quel thread de n'importe quel appel d'application
TimeZone.setDefault
. Un tel appel affecte immédiatement toutes les applications de cette JVM.java.time
Certaines des autres réponses étaient correctes, mais sont maintenant dépassées. Les terribles classes de date-heure fournies avec les premières versions de Java étaient défectueuses, écrites par des personnes qui ne comprenaient pas les complexités et les subtilités de la gestion de la date-heure.
Les anciennes classes date-heure ont été remplacées par les classes java.time définies dans JSR 310.
Pour représenter un fuseau horaire, utilisez
ZoneId
. Pour représenter un décalage par rapport à UTC, utilisezZoneOffset
. Un décalage est simplement un nombre d'heures-minutes-secondes en avant ou en arrière du méridien principal. Un fuseau horaire, c'est bien plus. Un fuseau horaire est une histoire des changements passés, présents et futurs du décalage utilisé par les habitants d'une région particulière.Pour un décalage de zéro heure-minute-seconde, utilisez la constante
ZoneOffset.UTC
.Instant
Pour capturer le moment actuel en UTC, utilisez un fichier
Instant
. Cette classe représente un moment en UTC, toujours en UTC par définition.ZonedDateTime
Pour voir ce même moment à travers l'heure de l'horloge murale utilisée par les habitants d'une région particulière, ajustez-vous dans un fuseau horaire. Même moment, même point sur la chronologie, heure d'horloge murale différente.
Base de données
Vous mentionnez une base de données.
Pour récupérer un instant de la base de données, votre colonne doit être d'un type de données similaire au standard SQL
TIMESTAMP WITH TIME ZONE
. Récupérez un objet plutôt qu'une chaîne. Dans JDBC 4.2 et versions ultérieures, nous pouvons échanger des objets java.time avec la base de données. LeOffsetDateTime
est requis par JDBC, tandis queInstant
&ZonedDateTime
sont facultatifs.Dans la plupart des bases de données et des pilotes, je suppose que vous obtiendrez le moment comme vu en UTC. Mais sinon, vous pouvez régler de deux manières:
Instant
:odt.toInstant()
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir les classes java.time?
la source
créer une paire client / serveur, de sorte qu'après l'exécution, le serveur client envoie l'heure et la date correctes. Ensuite, le client demande au serveur pm GMT et le serveur renvoie la bonne réponse.
la source
Utiliser la propriété système:
la source
Exécutez cette ligne dans MySQL pour réinitialiser votre fuseau horaire:
la source
Sensationnel. Je sais que c'est un fil ancien, mais tout ce que je peux dire, c'est de ne pas appeler TimeZone.setDefault () dans aucun code de niveau utilisateur. Cela définit toujours le fuseau horaire pour l'ensemble de la JVM et est presque toujours une très mauvaise idée. Apprenez à utiliser la bibliothèque joda.time ou la nouvelle classe DateTime de Java 8 qui est très similaire à la bibliothèque joda.time.
la source
Si vous souhaitez obtenir l'heure GMT uniquement avec intiger: var currentTime = new Date (); var currentYear = '2010' var currentMonth = 10; var currentDay = '30 'var currentHours = '20' var currentMinutes = '20 'var currentSeconds = '00' var currentMilliseconds = '00 '
la source