OffsetDateTime - "2019-04-01T00:00:00+09:00" の "+09:00" って何??

OffsetDateTime っていうのはオフセット情報がついた日時のフォーマットです。

こういうやつ。

2019-04-01T00:00:00+09:00

で、ここの最後についている

+09:00

これがオフセットです。

厳密なところはISO 8601に定義されてるんですが

一旦気になるところだけ解説すると、

これはUTCからどれだけ時差があるか、を示しており、

詳しい人が見れば、どのあたりTimeZoneなのかがわかります。

まあ、経度が同じであれば ZoneId が異なっていてもオフセットは同じってことがありえる(1..n)ので、ある程度は、って感じです。

たとえばUTC+9時間はJST、Zone名でいうとAsia/Tokyoが思い浮かびますが、ロシアのヤクーツク時間である Asia/Yakutsk も同じオフセット(+09:00)を持っています。

なので「だいたいあのへん」「このうちのどれか」ってのはわかりますが、特定まではできないですね。

TimeZoneの特定までしたいのであれば、OffsetDateTime ではなく ZonedDateTime を使う必要があります。

で、これ

2019-04-01T00:00:00+09:00

は単に

2019-04-01T00:00:00です

という意味です。

決して

この時刻に9時間プラスして2019-04-01T09:00:00

のように計算しなければいけないわけではありません

そのまま日時を使えます。

ついでの情報として「ちなみになんだけど、この時刻はUTCから9時間プラスされています」っていう情報がくっついているだけです。

なのでこれをUTCに変換する場合は、この9時間前なので

日時としては2019-03-31T15:00:00となります。

ただこれだと LocalDateTime と見分けがつかないので、

OffsetDateTime の UTCである印として、最後にZをつけて

2019-03-31T15:00:00Z

になり、時刻としては

2019-04-01T00:00:00+09:00 = 2019-03-31T15:00:00Z

ということになります。