J'ai un horodatage qui est en UTC et je veux le convertir en heure locale sans utiliser un appel d'API comme TimeZone.getTimeZone("PST")
. Comment êtes-vous censé faire exactement cela? J'ai utilisé le code suivant sans grand succès:
private static final SimpleDateFormat mSegmentStartTimeFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(mSegmentStartTimeFormatter.parse(startTime));
}
catch (ParseException e) {
e.printStackTrace();
}
return calendar.getTimeInMillis();
Exemple de valeur d'entrée: [2012-08-15T22:56:02.038Z]
devrait renvoyer l'équivalent de [2012-08-15T15:56:02.038Z]
Date
n'a pas de fuseau horaire et stocke en interne en UTC. La correction du fuseau horaire s'applique uniquement lorsqu'une date est formatée. Lorsque vous utilisez un DateFormat
, il correspond par défaut au fuseau horaire de la machine virtuelle Java dans laquelle il s'exécute. Utilisez setTimeZone
pour le modifier si nécessaire.
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");
DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
pstFormat.setTimeZone(TimeZone.getTimeZone("PST"));
System.out.println(pstFormat.format(date));
Cela imprime 2012-08-15T15:56:02.038
Notez que j'ai omis le 'Z'
au format PST car il indique UTC. Si vous venez d'utiliser Z
, la sortie sera 2012-08-15T15:56:02.038-0700
Utilisez la moderne Java API date et heure, et c'est simple:
String inputValue = "2012-08-15T22:56:02.038Z";
Instant timestamp = Instant.parse(inputValue);
ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles"));
System.out.println(losAngelesTime);
Ceci imprime
2012-08-15T15:56:02.038-07:00[America/Los_Angeles]
Points à noter:
Z
dans votre horodatage signifie UTC, également appelé heure zoulou. Donc, dans votre valeur d'heure locale, le Z
ne devrait pas être là. Vous voudriez plutôt une valeur de retour comme par exemple 2012-08-15T15:56:02.038-07:00
, car le décalage est désormais de -7 heures au lieu de Z.Instant
. Convertissez en ZonedDateTime
uniquement lorsque vous en avez besoin, comme pour la présentation.Question: Puis-je utiliser l'API moderne avec ma Java?
Si vous utilisez au moins Java 6 , vous le pouvez.