java - 如何比较时区

标签 java timezone comparison comparator

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

我正在使用 java.util.TimeZone (它没有实现 Comparable )。

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

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

请注意,我无法使用 Joda Time对于这个问题,所以“使用 Joda Time”不是一个有效的答案。

为清楚起见进行编辑

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

最佳答案

我自己滚了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/

相关文章:

php - SQL - 将 DateTime 与当前时间进行比较

java - Java扫描程序字符串比较

java - 为什么企业要同时使用Struts 1和Spring

java - subString结合for循环的做法

javascript - 在javascript中根据timezoneid获取当前时间

PHP 从字符串中解析日期

Java Enum.valueOf() 值不存在时的效率

java - 能否在代码中的log4j.properties中设置指定的appender

c# - 在 .net 核心中设置全局时区

javascript - 使用 jQuery 检测 JSON 数组中有多少元素发生了变化