7

異なる TimeZones にある 2 つの DateTime オブジェクトを比較するのに苦労しています。

私がすでに知っていること:

1) 「isBefore()」メソッドはTimeZones を考慮していないことを知っています。したがって、次の「if」条件は true ではありません (tr​​ue にしたいのですが):

long aRandomTimeSinceTheEpoch = 1234567789L;

String TIMEZONE_SYDNEY_AUSTRALIA = "Australia/Sydney";
DateTimeZone sydneyTimeZone = DateTimeZone.forID(TIMEZONE_SYDNEY_AUSTRALIA);
Chronology chronologySydney = GJChronology.getInstance(sydneyTimeZone);

String TIMEZONE_NEWYORK = "America/New_York";
DateTimeZone newYorkTimeZone = DateTimeZone.forID(TIMEZONE_NEWYORK);
Chronology chronologyNewYork = GJChronology.getInstance(newYorkTimeZone);

DateTime sydneyDateTime = new DateTime(aRandomTimeSinceTheEpoch, chronologySydney);
DateTime newYorkDateTime = new DateTime(aRandomTimeSinceTheEpoch, chronologyNewYork);

if( newYorkDateTime.isBefore(sydneyDateTime) ){
    System.out.println("true");
}

2) この回答 ( https://stackoverflow.com/a/8793980 ) に基づくと、Period は私がやろうとしていることの正しい概念であるため、代わりに Period を使用するのが正しい方法のようです。ただし、そのコードは「UnsupportedOperationException - 期間に年または月が含まれる場合」例外をスローすることがあります (互いに最大 2 年離れた日付を扱っているため)。

要するに、必要なのは TimeZones を考慮した"isBefore()"メソッドだけです。(そして、上記のような例外はスローされません)。Jodaでこれを達成するにはどうすればよいですか?

4

2 に答える 2

9

あなたが見逃しているのは、いつでもエポックから秒またはミリ秒で測定していることです-それは常にUTCです。

したがって、sydneyDateTimenewYorkDateTimeは異なるゾーンを持つ可能性がありますが、どちらも同じaRandomTimeSinceTheEpoch値から発生しているため、両方がまったく同じ瞬間に発生します。したがって、どちらも他のではありません。

類推すると、1 インチと 2.54 センチメートルのどちらが大きいかを尋ねるようなものです。

あなたのコメントから、各タイムゾーンの現地時間を比較したいようです。これは次のように行うことができます:

if( newYorkDateTime.toLocalDateTime().isBefore(sydneyDateTime.toLocalDateTime()) )

常に同じソース インスタントから開始する場合、この値は常に true になることに注意してください。2.54 が常に 1 より大きいのと同じです。

于 2013-08-18T23:24:08.583 に答える
2

各日付で使用getMillis()してミリ秒を取得し、それらを比較すると、比較する数値の絶対ペアが得られます。

于 2013-08-18T23:03:50.360 に答える