我需要比较时区 Asia/Singapore
< UTC
< Pacific/Honolulu
.
我正在使用 java.util.TimeZone
(它没有实现 Comparable
)。
我对现有实现的搜索没有成功,因为关于比较不同时区的日期的问题太多了。
问题什么是Comparator<TimeZone>
的正确实现?这将解决这个问题(如果适用,它比其他解决方案更好的地方是什么)?
请注意,我无法使用 Joda Time对于这个问题,所以“使用 Joda Time”不是一个有效的答案。
为清楚起见进行编辑
<
上面的符号定义不明确。我的特定用例只需要从东到西的天真“地理”排序。正如评论所指出的那样,更高级和通用的解决方案将考虑时间因素,例如夏令时和历史 GMT 偏移量变化。所以我认为我们可以考虑两种顺序,每一种都需要不同的 Comparator<TimeZone>
。实现:
- 严格地理(当前 UTC)- 由 my answer 寻址.
- 对本地或民用时间变化敏感 - 由 rgettman's answer 解决.
最佳答案
我自己滚了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
但我仍然想知道这个解决方案是否存在缺陷和/或是否有更好的选择。
关于java - 如何比较时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169108/