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?

Author: Community, 2011-05-20

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.

 6
Author: mdrg, 2011-05-20 19:59:51

, 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é.

 2
Author: Paweł Dyda, 2011-05-21 15:31:57

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 ISTcar 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?

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.

 0
Author: Basil Bourque, 2017-05-23 11:52:56