年、月、週、日、時間、分、秒を表す間隔データ型が必要です。最初の 3 つ (年、月、日) は実行できPeriod
、最後の 3 つ (時間、分、秒) は実行できますがDuration
、両方を実行できるものはないようです。理想的には、カスタムを実装する必要は避けたいと思いますTemporalAmount
。
4296 次
2 に答える
2
そのようなクラスが存在しない理由は、実際には 2 つの異なる時間の概念があるためです。(1) Java の世界ではDurationと呼ばれる固定の (たとえば) 秒数、または (2) たとえば、可変の秒数です。ピリオドと呼ばれます。期間は、長さの変化から抽象化しようとします
- 分 (うるう秒、これは実装されていません)
- 日 (夏時間)
- 月 (28、29、30、31 日)
- 年(うるう年)
そのためPeriod
、日、月、年、およびDuration
秒とナノ秒を格納します。はい、同じ時間単位を共有していますDAY
が、Duration
1 日は 24 時間と見なされ、直接秒に変換されます。
2016-02-01 から 2016-03-01 までの期間は 1 か月です。期間は 720 時間ではなく 696 時間です。期間の長さが変わる可能性があると言えます。
したがって、アプリケーションを定義する必要があります。期間 (一定の秒数) または期間 (1 年に 1 回「発生する」もの) が必要ですか?
夏時間の変更後のさまざまな瞬間を計算する方法の例を次に示します。
Duration oneDayDuration = Duration.ofDays(1);
Period oneDayPeriod = Period.ofDays(1);
ZonedDateTime beforeChange = Instant.parse("2015-10-25T00:00:00.00Z").atZone(ZoneId.of("Europe/Berlin"));
System.out.println(beforeChange);
System.out.println(oneDayDuration.addTo(beforeChange));
System.out.println(oneDayPeriod.addTo(beforeChange));
印刷します
2015-10-25T02:00+02:00[Europe/Berlin]
2015-10-26T01:00+01:00[Europe/Berlin]
2015-10-26T02:00+01:00[Europe/Berlin]
于 2016-01-04T17:11:00.153 に答える