Java: Calcul de la différence de fuseau horaire


Comment obtenir la différence de temps avec GMT pour une date et un fuseau horaire spécifiques en Java?

Déterminer si un fuseau horaire spécifique est en heure d'été est assez simple:

boolean isIsraelInDST = TimeZone.getTimeZone("Israel").inDaylightTime(new Date());

Comment puis-je obtenir le décalage horaire réel?

Author: Adam Matan, 2013-04-03

5 answers

Utilisez le fuseau horaire.getRawOffset (): Renvoie la quantité de temps en millisecondes à ajouter à UTC pour obtenir l'heure standard dans ce fuseau horaire. Comme cette valeur n'est pas affectée par l'heure d'été, elle est appelée décalage brut.

Si vous voulez le décalage, y compris DST, vous utilisez TimeZone.getOffset (date longue). Vous devez fournir la date concrète à la méthode, par exemple maintenant - Système.currentTimeMillis()

 19
Author: Evgeniy Dorofeev, 2013-04-03 13:53:08

Je vois que c'est un vieux thread-mais en ajoutant ceci car j'avais une exigence similaire récemment - Cela donne la différence réelle en millis basée sur l'heure ACTUELLE(millis d'époque).

    TimeZone.getTimeZone("America/New_York").getOffset(Calendar.getInstance().getTimeInMillis())
 7
Author: Vinay Rao, 2014-05-05 11:41:10

Je suggère d'ajouter le décalage horaire été / hiver à getRawOffset:

    TimeZone tz1 = TimeZone.getTimeZone("GMT");
    TimeZone tz2 = TimeZone.getTimeZone("America/New_York");
    long timeDifference = tz1.getRawOffset() - tz2.getRawOffset() + tz1.getDSTSavings() - tz2.getDSTSavings();
 7
Author: Andy Malakov, 2014-06-06 17:59:04

Tl; dr

ZoneId.of( "Pacific/Auckland" )   // Specify a time zone.
    .getRules()                   // Get the object representing the rules for all the past, present, and future changes in offset used by the people in the region of that zone.
    .getOffset( Instant.now() )   // Get a `ZoneOffset` object representing the number of hours, minutes, and seconds displaced from UTC. Here we ask for the offset in effect right now.
    .toString()                   // Generate a String in standard ISO 8601 format.

+13:00

Pour le premier moment d'une certaine date.

ZoneId.of( "Pacific/Auckland" )
    .getRules()
    .getOffset( 
        LocalDate.of( 2018 , Month.AUGUST , 23 )          // Specify a certain date. Has no concept of time zone or offset.
        .atStartOfDay( ZoneId.of( "Pacific/Auckland" ) )  // Determine the first moment of the day on that date in that region. Not always `00:00:00` because of anomalies such as Daylight Saving Time.
        .toInstant()                                      // Adjust to UTC by extracting an `Instant`. 
    ) 
    .toString()

+12:00

Éviter les classes date-heure héritées

Les autres réponses sont dépassées, car la classe TimeZone est maintenant héritée. Ceci et d'autres anciennes classes date-heure gênantes sont supplantés par le java.temps classes de temps.

Java.temps

Maintenant que nous utilisons ZoneId, ZoneOffset, et ZoneRules au lieu de l'héritage TimeZone classe.

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 ISTcar ce sont pas de vrais fuseaux horaires, non standardisés et même pas uniques(!).

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  

Récupère les règles de cette zone.

ZoneRules rules = z.getRules() ;

Demandez aux règles si l'heure d'été (heure avancée) est en vigueur à un certain moment. Spécifiez le moment sous la forme d'un Instant. Le Instant la classe représente un moment dans le scénario de UTC, avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).

Instant instant = Instant.now() ;  // Capture current moment in UTC.
boolean isDst = rules.isDaylightSavings( instant ) ;

Comment puis-je obtenir le décalage horaire réel?

Je ne sais pas ce que vous voulez dire, mais je suppose que vous demandez le offset-from-UTC en vigueur à ce moment-là pour que la zone. Un décalage est un nombre d'heures, de minutes et de secondes de décalage par rapport à UTC. Nous représentons une le décalage avec la ZoneOffset classe. Un fuseau horaire est un historique des changements passés, présents et futurs de décalage utilisés par les habitants d'une région particulière. Nous représentons un fuseau horaire en utilisant ZoneId classe.

Parce que le décalage peut varier dans le temps pour une région, nous devons passer un moment lorsque nous demandons un décalage.

ZoneOffset offset = rules.getOffset( instant ) ;

Générez une chaîne représentant ce décalage au format standard ISO 8601 .

String output output = offset.toString() ;

Vous pouvez demander le décalage comme un nombre total de deuxième.

int offsetInSeconds = offset.getTotalSeconds() ;

À propos de java.temps

Le java.temps 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-Temps le projet, maintenant en mode de maintenance, conseille la migration vers le java.temps classes.

Pour en savoir plus, voir le Tutoriel Oracle. Et rechercher Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

En utilisant un pilote JDBCcompatible avec JDBC 4.2ou version ultérieure, vous pouvez échanger java.temps objets directement avec votre base de données. Pas besoin de chaînes ni de java.SQL.* classe.

Où obtenir le java.les classes de temps?

  • Java SE 8, Java SE 9, et plus tard
    • Intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de java.la fonctionnalité time est back-ported vers Java 6 & 7 dans ThreeTen-Backport.
  • Android
    • Versions ultérieures des implémentations Android bundle de java.les classes de temps.
    • Pour Android plus tôt, le Troisabp le projet adapteThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP....

Le Trois-Extra le projet é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.

 4
Author: Basil Bourque, 2018-02-26 05:34:27
public String timeZone(Date date) {
    TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
    long millis = timeZone.getRawOffset() + (timeZone.inDaylightTime(date) ? timeZone.getDSTSavings() : 0);

    return String.format("%s%s:%s",
            millis < 0 ? "-" : "+",
            String.format("%02d", Math.abs(TimeUnit.MILLISECONDS.toHours(millis))),
            String.format("%02d", Math.abs(TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))))
    );
}
 2
Author: yogeshd, 2015-05-19 10:41:23