自動更新サブスクリプションのApp Storeからレシートを返すときに、Apple Etc/GMTタイムゾーンを使用する理由は何ですか?.
Etc/GMTタイムゾーンとは正確には何ですか? Java SDKはこのタイムゾーンを理解しますか?または Joda-Time のような他のサードパーティライブラリを使用する必要がありますか?
Etc/GMTはUTCまたはGMTとまったく同じではありません。オフセットが0の場合にのみ、それらは同じ瞬間を表します。他のすべての場合では、それらはまったく異なります。
Appleは指定 here について説明しています。
リンクからの直接の引用は例を与えます:
多くの人が期待するものとは逆ですが、ゾーン名と出力の省略形にはPOSIXスタイルの記号を使用しています。 POSIXはグリニッジの西でポジティブサインを持っていますが、多くの人々はグリニッジの東でポジティブサインを期待しています。たとえば、TZ = 'Etc/GMT + 4'は省略形「GMT + 4」を使用し、UTCより4時間進んでいる(つまり、東グリニッジの4時間)グリニッジの)。
Etc/GMT
は、UTC
、GMT
、GMT0
または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
その他/ユニバーサル
...
時間帯をまたいで特定の時点を伝達する場合、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+0
、Etc/GMT+1
、Etc/GMT0
、Etc/GMT-0
、Etc/GMT-1
なども理解します。 (しゃれは意図されていません)データベースにもあるので。また、David Pedenが承認した回答の引用で言及されている逆符号を正しく処理します。
リンク
理解する:
さまざまな業界のさまざまなプロトコルの番号付けはさまざまですが、一部は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時間遅れるUTCEtc/GMT+12
_ = _-12:00
_オフセット= 12時間遅れるUTC…そして…
Etc/GMT-1
_ = _+01:00
_オフセット= 1時間先にUTCEtc/GMT-12
_ = _+12:00
_オフセット= 12時間先UTC混乱していますか?日時処理の風変わりな世界へようこそ。ここから変になるだけです。
キーポイント:
Java.util.Date
_、Calendar
、SimpleDateFormat
などは使用しないでください。幸い、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クラスを使用する必要があります。
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を使用して応答を処理できます。