106 votes

La Force de Java fuseau horaire GMT/UTC

J'ai besoin de forcer tout le temps les opérations connexes à l'heure GMT/UTC, quel que soit le fuseau horaire défini sur la machine. De toute façon pratique de le faire dans le code?

Pour préciser, je suis en utilisant le serveur de bd pour toutes les opérations, mais il sort formaté selon le fuseau horaire local.

Merci!

131voto

Kevin Brock Points 4695

Les OP ont répondu à cette question de changer le fuseau horaire par défaut pour une seule instance de l'exécution de la JVM, définissez l' user.timezone système de la propriété:

java -Duser.timezone=GMT ... <main-class>

Si vous avez besoin de configurer des zones de temps lors de la récupération de la Date/Heure/Timestamp objets à partir d'une base de données ResultSet, utiliser la deuxième forme de l' getXXX des méthodes qui prennent un Calendar objet:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ResultSet rs = ...;
while (rs.next()) {
    Date dateValue = rs.getDate("DateColumn", tzCal);
    // Other fields and calculations
}

Ou, réglage de 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();

Ces veillera à ce 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.

L' java.util.Date et java.sql.Date classes d'entreposer des temps (en millisecondes) de l'UTC. Pour le format de ces sur la sortie d'un autre fuseau horaire, utilisez SimpleDateFormat. Vous pouvez également associer un fuseau horaire avec la valeur à l'aide d'un Calendrier de l'objet:

TimeZone tz = TimeZone.getTimeZone("<local-time-zone>");
//...
Date dateValue = rs.getDate("DateColumn");
Calendar calValue = Calendar.getInstance(tz);
calValue.setTime(dateValue);

24voto

user3498546 Points 11

Aussi, si vous pouvez configurer la JVM fuseau horaire de cette façon

System.setProperty("user.timezone", "EST");

ou -duser.timezone=GMT dans la JVM arguments.

13voto

Todd Points 51

J'ai dû mettre de la JVM fuseau horaire pour Windows 2003 Serveur, car il revenait toujours GMT pour new Date();

-Duser.timezone=America/Los_Angeles

Ou votre fuseau horaire approprié. La recherche d'une liste de fuseaux horaires s'est avéré être un peu difficile aussi...

Voici deux de la 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

8voto

lwpro2 Points 5331

pour moi, juste rapide SimpleDateFormat,

  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"));
  }

ensuite le format de la date avec un autre fuseau horaire.

6voto

Eyal Schneider Points 11399

Je voudrais récupérer l'heure de la DB dans une forme brute (long ou d'horodatage de java Date), puis utilisez SimpleDateFormat de format, ou de Calendrier pour les manipuler. Dans les deux cas, vous devez définir le fuseau horaire de la des objets avant de l'utiliser.

Voir SimpleDateFormat.setTimeZone(..) et Calendar.setTimeZone(..) pour plus de détails

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X