web-dev-qa-db-fra.com

Forcer Java le fuseau horaire GMT / UTC

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!

84
SyBer

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

109
Kevin Brock

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.

20
MG Developer

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

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm

10
Todd

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.

8
lwpro2

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.

6
Eyal Schneider

Vous pouvez changer le fuseau horaire en utilisant TimeZone.setDefault () :

TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
4
snorbi

Utiliser la propriété système:

-Duser.timezone=UTC
1
Dawid Stępień

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.

1
bertan

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.

1
scot