【问题标题】:how to map timezone country with its cities in java如何在java中映射时区国家及其城市
【发布时间】:2021-01-18 15:47:08
【问题描述】:

我想创建一个以这种方式返回时区的服务:
时区列表:

(UTC+01:00) Europe/Warsaw"
[{utc= (UTC+01:00)  Europe/Berlin, country= germany},
{utc= UTC+01:00) Europe/Warsaw , country= polnd},]

...等等

有可能吗?因为我没有找到任何类似的例子。

【问题讨论】:

  • 您在 Native Java 中所能做的就是获取 ZoneId.getAvailableZoneIds().forEach(System.out::println); 这将返回区域 ID 集的可修改副本,但它不直接存在的国家/地区在Java中,我猜你需要通过其他API
  • 是的,我也想知道这是如何在 grafana 中制作的,我不知道如何获取国家/地区play.grafana.org/d/000000012/grafana-play-home?orgId=1
  • 这与您的问题有关吗?
  • 我受到了 grafana 示例的启发
  • 它有什么意义? Europe/Berlin 和 Europe/Warsaw 不是同一个时区,尽管这些年它们在冬季共享 +01:00 的偏移量。也许如果你能解释你为什么想要它,我们可以更好地指导你。

标签: java timezone backend


【解决方案1】:

java.time 可以给你一个近似值

    ZoneId inputZone = ZoneId.of("Europe/Warsaw");
    
    ZoneRules rules = inputZone.getRules();
    Instant timeNow = Instant.now();
    ZoneOffset currentOffset = rules.getOffset(timeNow);
    ZoneOffsetTransition lastTransition = rules.previousTransition(timeNow);
    ZoneOffsetTransition nextTransition = rules.nextTransition(timeNow);
    for (String zid : ZoneId.getAvailableZoneIds()) {
        ZoneRules zidRules = ZoneId.of(zid).getRules();
        if (zidRules.getOffset(timeNow).equals(currentOffset)
                && Objects.equals(zidRules.previousTransition(timeNow), lastTransition)
                && Objects.equals(zidRules.nextTransition(timeNow), nextTransition)) {
            System.out.println(zid);
        }
    }

这个 sn-p 的输出是:

Europe/Brussels
Europe/Warsaw
CET
Europe/Luxembourg
Europe/Malta
Europe/Busingen
Europe/Skopje
Europe/Sarajevo
Europe/Rome
Europe/Zurich
Europe/Gibraltar
Europe/Vaduz
Europe/Ljubljana
Europe/Berlin
Europe/Stockholm
Europe/Budapest
Europe/Zagreb
Europe/Paris
Africa/Ceuta
Europe/Prague
Europe/Copenhagen
Europe/Vienna
Europe/Tirane
MET
Europe/Amsterdam
Europe/San_Marino
Poland
Europe/Andorra
Europe/Oslo
Europe/Podgorica
Atlantic/Jan_Mayen
Europe/Madrid
Europe/Belgrade
Europe/Bratislava
Arctic/Longyearbyen
Europe/Vatican
Europe/Monaco

请注意,输出中的某些区域 ID 已被弃用和/或输出中其他 ID 的别名。

我假设如果一个时区具有以下所有三个,那么它就足够相似,可以输出。

  1. 相同的当前 UTC 偏移量(在本例中为 +01:00)
  2. 最后一次转换相同(在这种情况下,从 2020-10-25T03:00+02:00 的 +02:00 到 +01:00)
  3. 相同的下一个转换(在本例中为 2021-03-28T02:00+01:00 的 +02:00)

Java 不知道每个时区的国家。您可以在下面的第二个链接中查找它们。

它们仍然是不同的时区

使用不同的时区 ID 是有原因的。最常见的原因之一是它们实际上识别出的时区并不总是相同。以您问题中的两个时区为例,欧洲/柏林和欧洲/华沙,其中一些差异是:

  • 华沙从 1977 年开始引入夏令时 (DST)。柏林直到 1980 年才引入。
  • 第一次世界大战前,柏林的偏移量为 +01:00,而华沙的偏移量为 +01:24。
  • 截至 1893 年,柏林全年的偏移量为 +00:53:28,比华沙晚半个多小时。
  • 没有人知道这两个时区的未来会怎样。

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多