如何比较TimeZones

时间:2013-03-02 00:19:11

标签: java timezone comparison comparator

我需要比较时区,Asia/Singapore< UTC< Pacific/Honolulu

我正在使用java.util.TimeZone(未实现Comparable)。

由于关于将日期与不同时区进行比较的大量问题,我对现有实施的搜索未获成功。

问题Comparator<TimeZone>的正确实施方法是什么,可以解决这个问题(如果适用的话,是什么让它比其他解决方案更好?)

请注意,我无法使用Joda Time来解决此问题,因此“使用Joda Time”不是一个有效的答案。

为了清晰起见而编辑

上面的<符号没有明确定义。我的特定用例只需要从东到西的简单“地理”排序。正如评论所指出的,更先进和可推广的解决方案将考虑时间因素,如夏令时和历史GMT偏移变化。所以我认为我们可以考虑两个排序,每个排序需要不同的Comparator<TimeZone>实现:

3 个答案:

答案 0 :(得分:4)

我使用getRawOffset推出了自己的Comparator<TimeZone>实现进行比较:

@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

但是我仍然想知道这个解决方案是否存在缺陷和/或是否有更好的选择。

答案 1 :(得分:3)

有人可能会创建一个考虑时区差异的Comparator<TimeZone>TimeZone可能会或可能不会考虑夏令时,这会调整原始偏移,从而搞乱原始偏移比较。 TimeZone类似乎支持基于2 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);
   }
}

答案 2 :(得分:1)

时区纯粹是政治性的,因此任何使用不合格的时区都会给用户带来很多问题,具体取决于应用程序的功能以及需要或使用它的人。您可以通过解释为什么需要这样的订单来更好地询问您的问题。有相邻的时区,其中一个使用DST而另一个不使用。因此,一年中有60%,TZ1 = = TZ2,另外40%TZ1 <1。 TZ2。或者无论如何。

有地理(lat long)时区数据集和用于查询时区的网站。甚至是当前的DST设置。因此,您可能必须满足于需要至少每年更新一次的数据集。或者网络访问。

您可能不应该为它们指定大小。只有地理顺序 - 经度。

首先,如果你能告诉我们你想要做什么,那就太好了。并且答案不是:严格a> b> c基于本地时间的顺序。我编写了一段时间的日历,所以我实际上习惯了解这些东西。 明确地相信什么需要这种排序?