4

期間が次のように定義されているかどうかを知る必要があります。

DateTime start;
DateTime end;

内部にDSTがあります。

{start、end}で定義された期間のコレクションを繰り返し処理し、すべての反復で開始と終了を24時間進めます。結果の期間は深夜に始まり、次の深夜の1ミリ秒前に終了します。期間にシフト内の夏時間がある場合、誤った結果が生成されることがわかりました。例:

持っている:

Duration targetDuration = new Duration(24*60*60*1000L-1);
DateTime start = new DateTime("2012-03-10T00:00:00.000-08:00");
DateTime end = new DateTime("2012-03-10T23:59:59.999-08:00");   

次に、シフトが行われます。

start = end.plusMillis(1);
end = start.plus(targetDuration);

生成:

start = "2012-03-11T00:00:00.000-08:00"
end = "2012-03-12T00:59:59.999-07:00"   

期間にDSTが含まれているかどうかを確認できるJodaTimeの標準APIはありますか?

4

3 に答える 3

4

DateTimeZone.nextTransitionメソッドを使用します。開始が終了DateTimeより小さい場合、その間に少なくとも1つのタイムゾーン遷移が発生しています。これは、ルールの変更とDSTを考慮していません。つまり、タイムゾーンには、標準時間が新しいオフセットを持つことを示す新しいルールがある場合があり、これはタイムゾーンの遷移として表示されます。

if (start.getZone().nextTransition(start.getMillis()) < end.getMillis()) {
    // Time zone transition occurred, possibly due to DST
    ...
}
于 2012-07-11T04:21:49.083 に答える
2

startendが正しいタイムゾーンにある限り(たとえば、このコンストラクターを使用して作成された場合)、それらを使用して作成された間隔では、そのタイムゾーンのDSTを考慮に入れる必要があります。その間隔の期間が24時間に等しくない場合は、DSTポイントを超えています。

于 2012-07-09T08:54:00.687 に答える
0

夏時間はTimeZonesに大きく依存しているため(一部の地域ではDSTを実行せず、一部の移動時計は1時間、一部は2など)、時間変数は場所も考慮する必要があります。

DateTimeZoneそのため、クラスを確認する必要があるかもしれません

DateTimeZone

于 2012-07-09T06:25:25.173 に答える