6

Asia/Singapore<<のようなタイムゾーンを比較する必要がありUTCますPacific/Honolulu

私はjava.util.TimeZone(を実装していませんComparable)で作業しています。

異なるタイム ゾーンの日付を比較することに関して圧倒的な数の質問があったため、既存の実装を検索することはできませんでした。

質問:この問題を解決する正しい実装は何ですかComparator<TimeZone>(また、該当する場合、他のソリューションより優れている点は何ですか?

この問題にはJoda Timeを使用できないため、「Joda Time を使用する」は有効な回答ではありません。

明確にするために編集する

上記の<表記は明確に定義されていませんでした。私の特定のユースケースでは、東から西への単純な「地理的」順序付けのみが必要です。コメントが指摘しているように、より高度で一般化可能なソリューションでは、夏時間や過去の GMT オフセットの変更などの一時的な要因が考慮されます。したがって、考えられる順序は 2 つあります。それぞれに異なるComparator<TimeZone>実装が必要です。

  • 厳密に地理的 (現在の UTC) -私の回答で対処します。
  • 地方時または常用時の変更に敏感 - rgettman's answerによって対処されます。
4

3 に答える 3

4

比較のために使用して、独自のComparator<TimeZone>実装を展開しました。getRawOffset

@Override
public int compare(TimeZone tz1, TimeZone tz2) {
    return tz2.getRawOffset() - tz1.getRawOffset();
}

簡単なテストに合格したようです:

final List<TimeZone> timeZones = Arrays.asList(
        TimeZone.getTimeZone("UTC"),
        TimeZone.getTimeZone("America/Los_Angeles"),
        TimeZone.getTimeZone("America/New_York"),
        TimeZone.getTimeZone("Pacific/Honolulu"),
        TimeZone.getTimeZone("Asia/Singapore")
);

final List<TimeZone> expectedOrder = Arrays.asList(
        TimeZone.getTimeZone("Asia/Singapore"),
        TimeZone.getTimeZone("UTC"),
        TimeZone.getTimeZone("America/New_York"),
        TimeZone.getTimeZone("America/Los_Angeles"),
        TimeZone.getTimeZone("Pacific/Honolulu")
);

Collections.sort(timeZones, new Comparator<TimeZone>() {
    @Override
    public int compare(TimeZone tz1, TimeZone tz2) {
        return tz2.getRawOffset() - tz1.getRawOffset();
    }
});

//Impl note: see AbstractList.equals
System.out.println(timeZones.equals(expectedOrder)); //true

しかし、この解決策に落とし穴があるかどうか、および/または何か望ましいものがあるかどうかはまだ疑問に思っています。

于 2013-03-02T00:19:10.510 に答える
3

Comparator<TimeZone>タイムゾーンの違いを考慮した を作成できる場合があります。はTimeZone、生のオフセットを調整する夏時間を観察する場合と観察しない場合があり、生のオフセットのみの比較が台無しになります。クラスはTimeZone2つの方法に基づいて調整をサポートしているようgetOffsetですが、基準日が必要です。どうですか:

public class TimeZoneComparator implements Comparator<TimeZone>
{
   private long date;

   public TimeZoneComparator(long date)
   {
      this.date = date;
   }

   public int compare(TimeZone tz1, TimeZone tz2)
   {
      return tz2.getOffset(this.date) - tz2.getOffset(this.date);
   }
}
于 2013-03-02T01:08:06.943 に答える
1

タイムゾーンは純粋に政治的なものであるため、不適合なタイムゾーンを使用すると、アプリの機能や、アプリを必要とするユーザーや使用するユーザーによっては、ユーザーに多くの問題が発生します。なぜそのように注文する必要があるのか​​を説明することで、質問をする方がよいでしょう。一方がDSTを使用し、もう一方が使用しない隣接するタイムゾーンがあります。つまり、年間の60%、TZ1 == TZ2、残りの40%TZ1<TZ2です。または、どのような場合でも。

地理的な(緯度が長い)タイムゾーンデータセットと、タイムゾーンを照会するWebサイトがあります。現在のDST設定ですら。そのため、少なくとも年に1回は頻繁に更新する必要のあるデータセットを受け入れる必要があるかもしれません。またはWebアクセス。

おそらくそれらに大きさを割り当てるべきではありません。地理的な順序のみ-経度による。

まず、あなたが何をしようとしているのかを教えていただければ素晴らしいと思います。そして答えはそうではありません:現地時間に基づく厳密なa>b>cの順序。しばらくカレンダーをコーディングしていたので、実際にこのことを知っていました。この種の注文が必要であると明確に信じているものは何ですか?

于 2013-03-02T00:51:16.240 に答える