web-dev-qa-db-fra.com

Comment obtenir un horodatage UTC à partir du calendrier?

En Java, lorsque j’utilise Calendar.getInstance();, j’obtiens un objet Calendar pour le fuseau horaire actuel. Mais Java.sql.Timestamp est généralement stocké dans l'heure UTC et non dans l'heure locale. Alors, comment puis-je obtenir l'heure UTC à partir d'une instance de calendrier?

    DateFormat df = DateFormat.getTimeInstance();
    Calendar cal = Calendar.getInstance();
    Timestamp time = new Timestamp(cal.getTimeInMillis());

    // Prints local time
    System.out.println(df.format(new Date(time.getTime())));

    // Printe local time, but I want UTT Time
    System.out.println("timestamp: " + time);
13
Jonas

Lorsque vous appelez Calendar.getTime(), cela vous donnera une valeur qui n'a pas de fuseau horaire associé - ou vous pouvez penser qu'elle est en UTC - pour le instant que représente le calendrier. Donc, s'il était (par exemple) 9h dans le fuseau horaire du calendrier, il pourrait être 17h UTC.

Maintenant, Java.util.Date (et j'imagine que Timestamp) sera formaté dans le fuseau horaire par défaut du système lorsque vous appelez toString() (implicitement ou explicitement) - mais ne laissez pas cela vous tromper en pensant que le fuseau horaire fait partie des données dans l'objet lui-même.

Vous devez être très clair sur exactement ce que vous essayez d'atteindre - et vous constaterez probablement que Joda Time vous permet de l'exprimer dans le code plus clairement que les bibliothèques intégrées. faire.

16
Jon Skeet

Votre code fait déjà exactement ce que vous voulez. Timestamp (ainsi que Date) n'a pas d'informations de fuseau horaire et doit toujours contenir un horodatage GMT (qui est ce que Calendar.getTimeInMillis() renvoie).

La raison pour laquelle vous voyez l'heure locale imprimée est que les méthodes d'usine DateFormat ainsi que Timestamp.toString() utilisent implicitement le fuseau horaire du système.

11
Michael Borgwardt

L'extrait suivant devrait satisfaire vos exigences:

df.setTimeZone(TimeZone.getTimeZone("UTC"));
1
Prashanth