6

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

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

我对现有实现的搜索没有成功,因为关于将日期与不同时区进行比较的问题太多了。

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

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

为清晰起见进行编辑

上面的<符号没有很好的定义。我的特定用例只需要从东到西的天真“地理”排序。正如评论所指出的,更高级和更通用的解决方案将考虑夏令时和历史 GMT 偏移变化等时间因素。所以我认为我们可以考虑两种排序,每一种都需要不同的Comparator<TimeZone>实现:

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或可能不会观察夏令时,这将调整原始偏移量,从而弄乱仅原始偏移量的比较。该类TimeZone似乎支持基于 2getOffset种方法的调整,但它们需要一个参考日期。怎么样:

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。或者无论如何。

有地理(经纬度)时区数据集和查询时区的网站。即使是当前的 DST 设置。因此,您可能不得不满足于需要至少每年更新一次的数据集。或网络访问。

您可能不应该为它们分配大小。只有地理排序 - 按经度。

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

于 2013-03-02T00:51:16.240 回答