web-dev-qa-db-ja.com

Etc / GMTタイムゾーンについて

自動更新サブスクリプションのApp Storeからレシートを返すときに、Apple Etc/GMTタイムゾーンを使用する理由は何ですか?.

Etc/GMTタイムゾーンとは正確には何ですか? Java SDKはこのタイムゾーンを理解しますか?または Joda-Time のような他のサードパーティライブラリを使用する必要がありますか?

27
royalghost

Etc/GMTはUTCまたはGMTとまったく同じではありません。オフセットが0の場合にのみ、それらは同じ瞬間を表します。他のすべての場合では、それらはまったく異なります。

Appleは指定 here について説明しています。

リンクからの直接の引用は例を与えます:

多くの人が期待するものとは逆ですが、ゾーン名と出力の省略形にはPOSIXスタイルの記号を使用しています。 POSIXはグリニッジの西でポジティブサインを持っていますが、多くの人々はグリニッジの東でポジティブサインを期待しています。たとえば、TZ = 'Etc/GMT + 4'は省略形「GMT + 4」を使用し、UTCより4時間進んでいる(つまり、東グリニッジの4時間)グリニッジの)。

21
David Peden

Etc/GMTは、UTCGMTGMT0またはGMT+00:00の標準的な言い方です。

Java JDKはすべての形式を理解します。次の操作を行うと、実際にこれを簡単に確認できます。

import Java.util.TimeZone;

public class Playground {

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

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

これにより、Java JDKが解析できるさまざまなTimeZone形式がすべて出力されます。

...
その他/ GMT
その他/ GMT + 0
その他/ GMT-0
その他/ GMT0
その他/グリニッジ
その他/ UCT
その他/ UTC
その他/ユニバーサル
...

7
Nico Huysamen

時間帯をまたいで特定の時点を伝達する場合、UTCまたはGMTのいずれかを使用することをお勧めします(2つはほぼ同等であり、ほとんどの目的で区別しません)。 Appleがまさにこれを行うようです。

JDKはEtc/GMTを正しく理解します。

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

JDKはtzデータベース(以前はOlsonデータベースと呼ばれていました。下部にあるリンク)を使用します。データベース内のタイムゾーン名のリストは、下部にある別のリンクにあります。 Etc/GMTがそこにリストされています。これは、GMTのcanonical名として指定されていることに気づくでしょう(別名もあり、現在のものもあれば、非推奨のものもあります)。

余談ですが、私のコード行ではもちろん、Java.timeのZoneIdを使用しています。最新のJava日付と時刻のAPIです。これは、使用するJDKクラスです(また、使用したくないタイムゾーン用の古くて設計が不十分なクラスもあります)。

あなたが質問するつもりはなかったと思いますが、興味がある人のために:JDKはEtc/GMT+0Etc/GMT+1Etc/GMT0Etc/GMT-0Etc/GMT-1なども理解します。 (しゃれは意図されていません)データベースにもあるので。また、David Pedenが承認した回答の引用で言及されている逆符号を正しく処理します。

リンク

1
Ole V.V.

オフセットとゾーン

理解する:

  • offset-from-UTC は、単にUTCのベースラインを上回っている、またはUTCを下回っている時間数分秒の数です。
  • タイムゾーンはるかです。タイムゾーンは、特定の地域の人々が使用するオフセットに対する過去、現在、および将来の変更の履歴です。

正と負の番号付け

さまざまな業界のさまざまなプロトコルの番号付けはさまざまですが、一部はUTCのオフセットaheadを正の数に、他の数は負の数を使用することを考慮しています。対称的に、オフセットの後ろのUTCが負であると見なされるものと、正の値を使用するものがあります。

ISO 8601 など、私が見た最新のプロトコルでは、UTCの前の(東向きの)オフセットは正であり、UTCの後ろの(西向きの)オフセットは負です。したがって、南北アメリカのゾーンで使用されるオフセットは、_America/Los_Angeles_のオフセットが_-07:00_または_-08:00_のように負の数になります(今日は Daylight Saving Time( DST) )。

この方法(UTCの右が正、UTCの左が負)を主流として考え、反対はマイナーな迷惑なバリエーションとして考えることを学ぶことをお勧めします。

タイムゾーン名は通常、_Continent/Region_、_America/Edmonton_、_Europe/Paris_、_Africa/Tunis_、_Asia/Kolkata_などの_Pacific/Auckland_の形式です。これを見てください Wikipediaのリスト (最新ではない可能性があります)。いくつかの例外があります。 _Etc/GMT…_の名前には、正負逆の規則があります。

  • _Etc/GMT+1_ = _-01:00_オフセット= 1時間遅れるUTC
  • _Etc/GMT+12_ = _-12:00_オフセット= 12時間遅れるUTC

…そして…

  • _Etc/GMT-1_ = _+01:00_オフセット= 1時間先にUTC
  • _Etc/GMT-12_ = _+12:00_オフセット= 12時間UTC

混乱していますか?日時処理の風変わりな世界へようこそ。ここから変になるだけです。

キーポイント:

  • データを公開している人々の意味と意図を理解する。入力文字列の意味を決して想定しないでください。
  • Java.timeクラスは、すべての日時作業にのみ使用してください。ひどいレガシークラス_Java.util.Date_、CalendarSimpleDateFormatなどは使用しないでください。

幸い、Java.timeクラスは、この混乱を解決するのに役立ちます。 ZoneIdクラスを使用した Ole V.V.による正解 を参照してください。

あなたの質問

Apple Etc/GMTタイムゾーンを使用する理由)

それらはゼロのオフセット、UTC自体を意味します。文字列_Etc/GMT_は、UTCからのオフセットが0時間-分-秒の1つの正規ラベルです。

日時文字列の最後によく見られるZ(「Zulu」と発音)の文字は、オフセットがゼロの同じものを意味します。

Etc/GMTタイムゾーンとは正確には何ですか?

文字列_Etc/GMT_は、UTCからのオフセットが1つだけで、オフセットが0時間-分-秒のタイムゾーンの名前です。

_Europe/Berlin_や_Africa/Casablanca_などの他のほとんどのタイムゾーンでは、履歴のオフセットが異なります。たとえば、 that _Africa/Casablanca_ zone in Morocco では、政治家は昨年、標準時間とDSTを1年に2時間切り替えるのではなく、DST年に恒久的に留まることを決定しました。 -円形。それは、「政治家たちが再び心を変えるまで」という意味なので、私はくすくす笑いしながら「永久に」と言います。世界中の政治家は、驚くべき頻度でタイムゾーンを再定義する傾向を示しています。

Java SDKはこのタイムゾーンを理解していますか?

はい。 Ole V.V.の The Answer を参照してください:ZoneId.of( "Etc/GMT" )

または、Joda-Timeなどの他のサードパーティライブラリを使用する必要がありますか?

参考までに、 Joda-Time プロジェクトは メンテナンスモード になりました。 Java.time クラス。 Tutorial by Oracle を参照してください。

すべての日時処理には、Java.timeクラスを使用する必要があります。

1
Basil Bourque

App Storeの領収書には Javaライブラリ を使用し、日付形式について考えるのをやめることをお勧めします。

アーティファクトを追加( by.dev.madhead.utils.appstore_receipts_validator:model:2.0.0 )。

任意のHTTPクライアントを使用してApp Storeを呼び出し、応答を取得します(ここでは 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
        )
    }
}

ジャクソンで応答を解析します。

val response = objectMapper.readValue(rawResponse)

これで、プレーンな古いJava APIを使用して応答を処理できます。

0
madhead