我需要比较时区,比如Asia/Singapore < UTC < Pacific/Honolulu。
我正在使用java.util.TimeZone (它不实现Comparable)。
我对现有实现的搜索没有成功,因为有关将日期与不同时区进行比较的问题太多。
问题:什么是解决这个问题的正确的Comparator<TimeZone>实现(如果适用的话,是什么使它比其他解决方案更好)?
请注意,对于这个问题,我无法使用Joda时间,因此“使用Joda Time”不是一个有效的答案。
为清晰而编辑
上面的<表示法没有得到很好的定义。我的特定用例只需要从东到西简单的“地理”顺序。正如评论指出的那样,一种更先进、更通用的解决方案将考虑夏时制和历史格林尼治时间抵消变化等时间因素。因此,我认为有两个顺序我们可以考虑,每个订单需要一个不同的Comparator<TimeZone>实现:
发布于 2013-03-02 01:08:06
您可以创建一个考虑时区差异的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);
}
}发布于 2013-03-02 00:19:10
比较时,我使用getRawOffset来滚动我自己的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-02 00:51:16
时区纯粹是政治性的,所以任何不符合规定的使用都会给用户带来很多问题,这取决于应用程序做什么以及谁需要它或使用它。你的问题最好解释一下为什么你需要这样的命令。有一些相邻的时区,其中一个使用DST,另一个不使用DST。因此,每年的60%,TZ1 == TZ2,其他40% TZ1 < TZ2。或者不管是什么情况。
有地理(lat长)时区数据集,以及用于查询时区的网站。即使是当前的DST设置。因此,您可能必须满足一个数据集,您需要经常更新,至少每年。或者上网。
你可能不应该给他们定个等级。只有地理顺序-根据经度。
首先,如果你能告诉我们你想做什么,那就太好了。答案不是:严格的基于本地时间的a>b>c命令。我编写了一段时间的日历,所以我以前知道这些东西。究竟什么信仰需要这样的秩序?
https://stackoverflow.com/questions/15169108
复制相似问题