GooglePlayBilling でサブスクリプションの情報を取得する API のバージョンが変わりました。
これについては、以前紹介した通りです。

ここで気になったのが日時の表記。
「RFC3339 UTC “Zulu” format」というのが気になりますね。
今回は、この日付のフォーマット作成やエポックミリ秒への変換を試していきます。
日付フォーマットの仕様
GooglePlayBilling の API の仕様を確認すると、以下の説明が記載されています。
A timestamp in RFC3339 UTC “Zulu” format, with nanosecond resolution and up to nine fractional digits. Examples: “2014-10-02T15:01:23Z” and “2014-10-02T15:01:23.045123456Z”.
これまで通りエポックミリ秒でもいいのですが、レスポンスの中身を見ただけで日時がわかるというメリットはあります。
エポックミリ秒だと、日付フォーマットに変換しないとわからないですからね。

現在日時のZuluフォーマット
Kotlin で実際に現在日時を Zulu フォーマット表記で表示させてみましょう。
1 2 3 4 5 6 7 8 9 | import java.time.LocalDateTime import java.time.format.DateTimeFormatter fun main() { val zulu = LocalDateTime.now().format( DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") ) println(zulu) } |
このソースコードを実行したのが 2022 年 11 月 16 日の 19 時台ということで、結果は以下の通り。
2022-11-16T10:08:20.669Z
Zuluフォーマットからエポックミリ秒への変換
では、GooglePlayBilling からレスポンスされた日付項目を、エポックミリ秒に変換する方法を考えてみます。
ここでは上記で使用した現在日時をサンプルとします。
1 2 3 4 5 6 7 8 9 10 11 | import java.time.Instant import java.time.LocalDateTime import java.time.format.DateTimeFormatter fun main() { val zulu = LocalDateTime.now().format( DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") ) val em = Instant.parse(zulu).toEpochMilli() println(em) } |
結果は以下の通りです。
1668593300669
まとめ
RFC3339 UTC 「Zulu」 形式の日付フォーマットの変換について紹介してきました。
相互変換ができるようにしておけば、日付の扱いで困ることもありませんね。
自分のシステムだけであれば日付フォーマットは統一しておけますが、外部システムが絡むと厄介。
これが正解かと言われると未知数なので、Java の新しい日付クラスの情報も追いかけておきたいところです。