web-dev-qa-db-fra.com

Comprendre le fuseau horaire Etc / GMT

Quelle est la justification de Apple utilisant le fuseau horaire Etc/GMT quand ils retournent le reçu de l'App Store pour les abonnements auto-renouvelables.

Quel est exactement le fuseau horaire Etc/GMT? Est-ce que le Java SDK comprend ce fuseau horaire? Ou dois-je utiliser d'autres bibliothèques tierces comme Joda-Time ?

27
royalghost

Etc/GMT n'est pas strictement la même chose que UTC ou GMT. Ils ne représentent le même instant dans le temps que lorsque le décalage est égal à 0. Dans tous les autres cas, ils sont assez différents.

Apple explique la désignation ici .

Un devis directement à partir du lien donne un exemple:

Nous utilisons des signes de style POSIX dans les noms de zone et les abréviations de sortie, même si c'est le contraire de ce que beaucoup de gens attendent. POSIX a des signes positifs à l'ouest de Greenwich, mais beaucoup de gens s'attendent à des signes positifs à l'est de Greenwich. Par exemple, TZ = 'Etc/GMT + 4' utilise l'abréviation "GMT + 4" et correspond à 4 heures de retard sur UTC (c'est-à-dire à l'ouest de Greenwich) même si beaucoup de gens s'attendent à ce que cela signifie 4 heures d'avance sur UTC (c'est-à-dire à l'est de Greenwich).

21
David Peden

Etc/GMT est juste une façon standard de dire UTC, GMT, GMT0 ou GMT+00:00.

Le Java JDK comprend tous les formats. Vous pouvez facilement voir cela en action en procédant comme suit:

import Java.util.TimeZone;

public class Playground {

    public static void main(String... args) {

        for (String s : TimeZone.getAvailableIDs()) {
            System.out.println(s);
        }
    }
}

Cela affichera tous les différents formats TimeZone que votre Java JDK peut analyser:

...
Etc/GMT
Etc/GMT + 0
Etc/GMT-0
Etc/GMT0
Etc/Greenwich
Etc/UCT
Etc/UTC
Etc/Universel
...

7
Nico Huysamen

Lors de la transmission d'un point dans le temps à travers les fuseaux horaires, il est recommandé d'utiliser UTC ou GMT (les deux sont à peu près équivalents, dans la plupart des cas, nous ne faisons pas de distinction). Il semble que Apple fait exactement cela.

Le JDK comprend Etc/GMT ça va.

    ZoneId etcGmt = ZoneId.of("Etc/GMT");

JDK utilise la base de données tz (anciennement connue sous le nom de base de données Olson; lien en bas). La liste des noms de fuseaux horaires dans la base de données se trouve dans l'autre lien en bas. Etc/GMT y est répertorié. Vous remarquerez qu'il est donné comme le nom canonique pour GMT (il y a aussi quelques alias, certains actuels et d'autres obsolètes).

En passant, ma ligne de code utilise bien sûr ZoneId de Java.time, l'API moderne Java date et heure. C'est la classe JDK que vous voudrez utiliser ( il existe également une ancienne classe mal conçue pour les fuseaux horaires que vous ne souhaitez pas utiliser).

Je ne pense pas que vous vouliez demander, mais pour toute personne intéressée: JDK comprend également Etc/GMT+0, Etc/GMT+1, Etc/GMT0, Etc/GMT-0, Etc/GMT-1, etc. (sans jeu de mots) puisqu'ils sont également dans la base de données. Et il gère correctement le signe inversé mentionné dans la citation dans la réponse acceptée par David Peden.

Liens

1
Ole V.V.

Décalage par rapport à la zone

Comprendre:

  • Un offset-from-UTC est simplement un nombre d'heures-minutes-secondes, avant la ligne de base de UTC, ou derrière UTC.
  • A fuseau horaire est beaucoup plus. Un fuseau horaire est une histoire des changements passés, présents et futurs du décalage utilisé par les habitants d'une région particulière.

Numérotation positive ou négative

Différents protocoles dans diverses industries ont varié dans leur numérotation, certains considérant que les décalages en avant de l'UTC sont des nombres positifs tandis que d'autres ont utilisé des nombres négatifs. Symétriquement, certains considéraient les décalages derrière UTC comme négatifs tandis que d'autres utilisaient des valeurs positives.

Dans la plupart des protocoles modernes que j'ai vus, tels que ISO 8601 , les décalages avant UTC (vers l'est) sont positifs, tandis que les décalages derrière UTC (vers l'ouest) sont négatifs. Ainsi, les décalages utilisés par les zones des Amériques ont des nombres négatifs tels que America/Los_Angeles Ayant un décalage de -07:00 Ou -08:00 De nos jours (varie au cours de l'année en raison de Daylight Gain de temps (DST) ).

Je vous suggère d'apprendre à penser de cette manière (la droite de l'UTC est positive, la gauche de l'UTC est négative) comme courant, et le contraire comme une variation mineure ennuyeuse.

Les noms de fuseau horaire sont généralement au format Continent/Region, Tel que America/Edmonton, Europe/Paris, Africa/Tunis, Asia/Kolkata Et Pacific/Auckland. Voir ceci liste sur Wikipedia (peut ne pas être à jour). Il y a quelques exceptions. Les noms Etc/GMT… Portent la convention plus/moins opposée:

  • Etc/GMT+1 = -01:00 Offset = Une heure derrière UTC
  • Etc/GMT+12 = -12:00 Offset = Douze heures derrière UTC

…et…

  • Etc/GMT-1 = +01:00 Offset = Une heure avant UTC
  • Etc/GMT-12 = +12:00 Offset = Douze heures avant UTC

Déroutant? Bienvenue dans le monde loufoque de la gestion de la date et de l'heure. Cela ne fait que devenir plus étrange à partir d'ici.

Points clés:

  • Comprenez la signification et les intentions de ces personnes qui publient des données. N'assumez jamais la signification d'une chaîne d'entrée.
  • Utilisez les classes Java.time uniquement pour tout votre travail de date-heure. N'utilisez jamais les terribles classes héritées Java.util.Date, Calendar, SimpleDateFormat, etc.

Heureusement, les classes Java.time peuvent vous aider dans cette confusion. Voir la réponse correcte d'Ole V.V. en utilisant la classe ZoneId.

Vos questions

justification de Apple en utilisant le fuseau horaire Etc/GMT

Ils signifient un décalage de zéro, UTC lui-même. La chaîne Etc/GMT Est une étiquette canonique pour un décalage par rapport à UTC de zéro heure-minute-seconde.

La lettre Z (prononcée "Zulu") vue couramment à la fin des chaînes date-heure signifie la même chose, un décalage de zéro.

Quel est exactement le fuseau horaire Etc/GMT?

La chaîne Etc/GMT Est un nom pour un fuseau horaire qui n'a jamais eu qu'un seul décalage par rapport à UTC, un décalage de zéro heure-minute-seconde.

La plupart des autres fuseaux horaires tels que Europe/Berlin Ou Africa/Casablanca Ont varié dans leur décalage au cours de l'histoire. Par exemple, dans cette zone Africa/Casablanca Au Maroc , les politiciens ont décidé l'année dernière qu'au lieu de changer une heure deux fois par an pour l'heure standard et l'heure d'été, ils resteraient désormais en permanence sur l'heure d'été toute l'année. Je dis "en permanence" avec un petit rire, car cela signifie vraiment "jusqu'à ce que les politiciens changent à nouveau d'avis". Les politiciens du monde entier ont montré un penchant pour redéfinir leurs fuseaux horaires avec une fréquence surprenante.

Le SDK Java SDK comprend ce fuseau horaire?)

Oui. Voir la réponse par Ole V.V .: ZoneId.of( "Etc/GMT" )

Ou dois-je utiliser d'autres bibliothèques tierces comme Joda-Time?

Pour info, le Joda-Time project est maintenant en mode maintenance , conseillant la migration vers le - Java.time classes. Voir Tutoriel d'Oracle .

Vous devriez utiliser les classes Java.time pour toute votre gestion de date-heure.

1
Basil Bourque

Je vous suggère d'utiliser un bibliothèque Java pour les reçus de l'App Store et d'arrêter de penser au format de la date.

Ajoutez l'artefact ( by.dev.madhead.utils.appstore_receipts_validator:model:2.0.0 ).

Utilisez n'importe quel client HTTP pour appeler l'App Store et récupérer la réponse (ici, j'utilise Ktor ):

suspend fun verify(receipt: String, password: String): VerifyReceiptResponse {
    val rawResponse = client.post<String> {
        url("https://buy.iTunes.Apple.com/verifyReceipt")
        contentType(ContentType.Application.Json)
        accept(ContentType.Application.Json)
        body = VerifyReceiptRequest(
                receipt,
                password,
                true
        )
    }
}

Analysez la réponse avec Jackson:

val response = objectMapper.readValue(rawResponse)

Vous pouvez maintenant utiliser l'ancienne API Java API pour travailler avec la réponse.

0
madhead