Conversion de la date UTC en PST en Java
J'ai besoin de convertir la date du fuseau horaire du serveur local de Google App Engine en heure du Pacifique en Java.
J'ai essayé d'utiliser
Calendar calstart =
Calendar.getInstance();
calstart.setTimeZone(TimeZone.getTimeZone("PST"));
//calstart.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
Date startTime = calstart.getTime();
Mais cela me donne une heure incorrecte (certains 4pm lorsque la TVP réelle est 22pm). J'ai également essayé la ligne commentée America/Los_Angeles
mais donne une heure incorrecte sur le serveur GAE.
Des pensées / conseils?
3 answers
En utilisant Joda Time, tout ce dont vous avez besoin est le DateTime.Méthode withZone . Exemple ci-dessous:
public static Date convertJodaTimezone(LocalDateTime date, String srcTz, String destTz) {
DateTime srcDateTime = date.toDateTime(DateTimeZone.forID(srcTz));
DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID(destTz));
return dstDateTime.toLocalDateTime().toDateTime().toDate();
}
À titre de conseil, n'utilisez jamais l'API par défaut pour les calculs liés au temps. C'est juste horrible. Joda semble être la meilleure API de remplacement.
, Sauf si vous avez besoin de faire quelques calculs, donc vous voulez formater cette date pour l'afficher à l'utilisateur final, vous pouvez simplement utiliser DateFormat:
Date startTime = new Date(); // current date time
TimeZone pstTimeZone = TimeZone.getTimeZone("America/Los_Angeles");
DateFormat formatter = DateFormat.getDateInstance(); // just date, you might want something else
formatter.setTimeZone(pstTimeZone);
String formattedDate = formatter.format(startTime);
Cependant, si vous avez vraiment besoin de convertir des dates (ce qui est vraiment rare), vous pouvez utiliser l'extrait de code suivant:
TimeZone pacificTimeZone = TimeZone.getTimeZone("America/Los_Angeles");
long currentTime = new Date().getTime();
long convertedTime = currentTime +
pacificTimeZone.getOffset(currentTime);
Cela vous donnera le nombre de millisecondes écoulées depuis le 1er janvier 1970 dans le fuseau horaire PST. Vous pouvez facilement créer un objet Date avec ces informations.
Si vous devez effectuer des calculs de date très souvent, vous pouvez utiliser DateUtils d'Apache Commons Lang. Ou de passer à JodaTime comme mdrg suggéré.
Ne dépend jamais du fuseau horaire du serveur
Ne dépendez jamais du fuseau horaire par défaut actuel de la JVM du serveur ou de l'hôte.
Spécifiez toujours explicitement votre fuseau horaire souhaité/attendu, passé en argument facultatif.
Java.temps
La classe java.util.Calendar
est maintenant héritée, supplantée par java.les classes de temps.
Obtenir le moment actuel en UTC. Le Instant
classe représente un moment sur la timeline dans UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
Instant instant = Instant.now();
Éphémère.toString (): 2017-01-19T22:01: 21.321 Z
Lorsque vous souhaitez afficher ce moment à travers la lentille d'une région particulière du horloge murale, appliquer un ZoneId
pour obtenir un ZonedDateTime
.
Spécifier un fuseau horaire nom dans le format continent/region
, tels que America/Montreal
, Africa/Casablanca
, ou Pacific/Auckland
. N'utilisez jamais l'abréviation de 3-4 lettres telle que EST
ou PST
ou IST
car ils sont pas vrais fuseaux horaires, non normalisés, et même pas uniques(!).
ZoneId z = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdt = instant.atZone( z );
Zdt.toString (): 2017-01-19T14:01:21.321-08: 00[Amérique/Los_Angeles]
À propos de java.temps
Le java.time framework est intégré à Java 8 et versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date-heure classes telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
Le Joda-Time, qui est maintenant dans mode de maintenance, conseille la migration vers la java.temps classes.
Pour en savoir plus, consultez le tutoriel Oracle. Et rechercher Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.
Où obtenir le java.les classes de temps?
-
Java SE 8 et SE 9 et plus tard
- Intégré.
- Partie de la norme API Java avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités et corrections mineures.
-
Java SE 6 et SE 7
- Une grande partie du java.fonction temps est de retour, porté à Java 6 et 7ThreeTen-Backport.
-
Android
- Le Troisabp le projet s'adapte ThreeTen-Backport (mentionné ci-dessus) pour Android spécifiquement.
- Voir Comment utiliser ThreeTenABP....
Le projet ThreeTen-Extra étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.temps. Vous pouvez trouver quelques classes utiles ici comme Interval
, YearWeek
, YearQuarter
, et plus.