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 commode de le retrouver dans le code?
Pour clarifier, j'utilise l'heure du serveur de base de données pour toutes les opérations, mais elle est formatée en fonction du fuseau horaire local.
Merci!
L'OP a répondu à cette question pour modifier le fuseau horaire par défaut pour une seule instance d'une machine virtuelle Java en cours d'exécution, définissez le paramètre user.timezone
propriété système:
Java -Duser.timezone=GMT ... <main-class>
Si vous devez définir des fuseaux horaires spécifiques lors de la récupération d'objets Date/Time/Timestamp d'une base de données ResultSet
, utilisez la seconde forme des méthodes getXXX
prenant un objet Calendar
:
Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ResultSet rs = ...;
while (rs.next()) {
Date dateValue = rs.getDate("DateColumn", tzCal);
// Other fields and calculations
}
Ou, définir la date dans un PreparedStatement:
Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
PreparedStatement ps = conn.createPreparedStatement("update ...");
ps.setDate("DateColumn", dateValue, tzCal);
// Other assignments
ps.executeUpdate();
Cela garantira la cohérence de la valeur stockée dans la base de données lorsque la colonne de la base de données ne conserve pas les informations de fuseau horaire.
Le Java.util.Date
et Java.sql.Date
Les classes stockent l'heure actuelle (millisecondes) en UTC. Pour les formater en sortie dans un autre fuseau horaire, utilisez SimpleDateFormat
. Vous pouvez également associer un fuseau horaire à la valeur à l'aide d'un objet Calendar:
TimeZone tz = TimeZone.getTimeZone("<local-time-zone>");
//...
Date dateValue = rs.getDate("DateColumn");
Calendar calValue = Calendar.getInstance(tz);
calValue.setTime(dateValue);
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
Aussi, si vous pouvez définir le fuseau horaire JVM de cette façon
System.setProperty("user.timezone", "EST");
ou -Duser.timezone=GMT
dans les arguments de la JVM.
J'ai dû définir le fuseau horaire de la machine virtuelle Java pour Windows 2003 Server, car il renvoyait toujours GMT pour new Date ();
-Duser.timezone=America/Los_Angeles
Ou votre fuseau horaire approprié. Trouver une liste de fuseaux horaires s'est avéré être un peu difficile aussi ...
Voici deux liste;
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
pour moi, juste SimpleDateFormat rapide,
private static final SimpleDateFormat GMT = new SimpleDateFormat("yyyy-MM-dd");
private static final SimpleDateFormat SYD = new SimpleDateFormat("yyyy-MM-dd");
static {
GMT.setTimeZone(TimeZone.getTimeZone("GMT"));
SYD.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
}
puis formatez la date avec un fuseau horaire différent.
Je voudrais récupérer l'heure de la base de données sous une forme brute (horodatage long ou date de Java), puis utiliser SimpleDateFormat pour la formater, ou le calendrier pour la manipuler. Dans les deux cas, vous devez définir le fuseau horaire des objets avant de l'utiliser.
Voir SimpleDateFormat.setTimeZone(..)
et Calendar.setTimeZone(..)
pour plus de détails.
Vous pouvez changer le fuseau horaire en utilisant TimeZone.setDefault () :
TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
Utiliser la propriété système:
-Duser.timezone=UTC
créez une paire client/serveur, de sorte qu'après le traitement, le serveur client envoie l'heure et la date correctes. Ensuite, le client demande au serveur pm GMT et le serveur renvoie la réponse correctement.
Sensationnel. Je sais que c'est un ancien fil conducteur, mais tout ce que je peux dire, c'est d'appeler TimeZone.setDefault () dans un code de niveau utilisateur. Ceci définit toujours le fuseau horaire pour l’ensemble de la machine virtuelle Java et est presque toujours une très mauvaise idée. Apprenez à utiliser la bibliothèque joda.time ou la nouvelle classe DateTime dans Java 8, qui est très similaire à la bibliothèque joda.time.