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);
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.
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.
L'extrait suivant devrait satisfaire vos exigences:
df.setTimeZone(TimeZone.getTimeZone("UTC"));