現在、日付が英国夏時間の内側と外側にある場合の ZonedDateTime の動作を見ています。
英国の夏時間は 3 月 25 日に始まり、1 時間 (+1) 追加されます。
ZonedDateTime (UTC およびヨーロッパ/ロンドン) のいくつかのインスタンスを作成し、次にそれらに 1 か月を追加して、それらが ZonedDateTime に分類されるようにしました。
// These dates will be outside British Summer Time
ZonedDateTime utcFirstMarch = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.of("UTC"));
ZonedDateTime londonFirstMarch = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.systemDefault());
// These dates will be inside British Summer Time
ZonedDateTime utcFirstMarchPlusMonth = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.of("UTC")).plusMonths(1);
ZonedDateTime londonFirstMarchPlusMonth = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.systemDefault()).plusMonths(1);
ZonedDateTime londonFirstMarchPlusMonthToUtc = ZonedDateTime.of(2018, 3, 1, 12, 0, 0, 0, ZoneId.systemDefault()).plusMonths(1).withZoneSameInstant(ZoneId.of("UTC"));
これは、これらの日付を印刷した結果です。
utcFirstMarch: 2018-03-01T12:00Z[UTC]
londonFirstMarch: 2018-03-01T12:00Z[Europe/London]
utcFirstMarchPlusMonth: 2018-04-01T12:00Z[UTC]
londonFirstMarchPlusMonth: 2018-04-01T12:00+01:00[Europe/London]
londonFirstMarchPlusMonthToUtc: 2018-04-01T11:00Z[UTC]
最後に、各日付のエポック秒を出力しました。
utcFirstMarch: 1519905600
londonFirstMarch: 1519905600
utcFirstMarchPlusMonth: 1522584000
londonFirstMarchPlusMonth: 1522580400
londonFirstMarchPlusMonthToUtc: 1522580400
ZonedDateTime が不変であることは知っています。これは、1 か月を追加すると、実際には変更された月で新しいインスタンスを作成することを意味します。与えられた観察に対する私の仮定が正しいかどうか教えてください。
1 か月追加すると、ZonedDateTime の新しいインスタンスが作成されます。ZonedDateTime の時間は常に同じです。新しい日付が BST かどうかは関係ありません。(LondonFirstMarch と LondonFirstMarchPlusMonth を見てください)
1 か月を追加した後、londonFirstMarchPlusMonth は BST に分類され、12:00 のままになるため、実際には 1 時間を抽出します。これは、基になるエポック秒が utcFirstMarchPlusMonth とは異なることを意味します。
最後に londonFirstMarchPlusMonthToUtc でゾーンを UTC に変換すると、実際の時間は 11:00 であることがわかりました。
- 正確に1か月後の日付が必要な場合。UTC のみを使用し、オプションで最後にロンドン/ヨーロッパに変換する必要がありますか?
編集:
おそらく私は十分に明確ではありませんでした - 申し訳ありません。1 か月は任意の値であるため、最初の日付に追加すると、BST に該当する 2 番目の日付が生成されます。
前述のように、1 か月は月によって意味が異なるため、おそらく良い例ではありません。私にとってのポイントは、「月」が 24 時間単位で構成されるということでした。(Ole.vvが言ったとおり)
UTC 時間で動作し、オプションでそれをヨーロッパ/ロンドンに変換することが、「私の質問」に対する解決策だと思います