我需要比较时区,Asia/Singapore
< UTC
< Pacific/Honolulu
。
我正在使用java.util.TimeZone
(未实现Comparable
)。
由于关于将日期与不同时区进行比较的大量问题,我对现有实施的搜索未获成功。
问题:Comparator<TimeZone>
的正确实施方法是什么,可以解决这个问题(如果适用的话,是什么让它比其他解决方案更好?)
请注意,我无法使用Joda Time来解决此问题,因此“使用Joda Time”不是一个有效的答案。
上面的<
符号没有明确定义。我的特定用例只需要从东到西的简单“地理”排序。正如评论所指出的,更先进和可推广的解决方案将考虑时间因素,如夏令时和历史GMT偏移变化。所以我认为我们可以考虑两个排序,每个排序需要不同的Comparator<TimeZone>
实现:
答案 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基于本地时间的顺序。我编写了一段时间的日历,所以我实际上习惯了解这些东西。 明确地相信什么需要这种排序?