使用Java中的城市名称获取本地时区

问题描述 投票:-3回答:1

使用城市名称(例如阿布扎比,悉尼,达卡,巴黎等)需要找到当地时区。可以使用2位数的国家代码

java timezone timezone-offset city
1个回答
0
投票

对于涵盖所有可思考城市名称的解决方案,这将需要包含城市及其相应时区的数据库。由于存在同名城市,因此您可能会有不明确的输入。例如,巴黎我认为你打算成为法国首都和欧洲最大的城市,但巴黎的城镇也存在于其他地方。我不知道是否存在合适的数据库,您可以搜索。

不过,我可以通过Java内置的东西让你接近。时区具有区域/城市形式的ID,例如Australia/SydneyAsia/Dubai。用于命名时区的城市是时区中人口最多的区域,因此即使在一个国家或州只有一个时区的情况下,城市也不一定是首都。但如果城市重合,我们可以找到该区域。

    Set<String> zids = ZoneId.getAvailableZoneIds();

    String[] cityNames = { "Abu Dhabi", "Dubai", "Sydney", "Dhaka", "Paris", "Indianapolis", "São Tomé" };
    for (String cityName : cityNames) {
        String tzCityName = Normalizer.normalize(cityName, Normalizer.Form.NFKD)
                .replaceAll("[^\\p{ASCII}-_ ]", "")
                .replace(' ', '_');
        List<String> possibleTimeZones = zids.stream()
                .filter(zid -> zid.endsWith("/" + tzCityName))
                .collect(Collectors.toList());
        System.out.format("%-12s %s%n", cityName, possibleTimeZones);
    }

此代码段的输出是:

Abu Dhabi    []
Dubai        [Asia/Dubai]
Sydney       [Australia/Sydney]
Dhaka        [Asia/Dhaka]
Paris        [Europe/Paris]
Indianapolis [America/Indianapolis, America/Indiana/Indianapolis]
São Tomé     [Africa/Sao_Tome]

你会注意到,它没有找到阿布扎比的任何时区,因为虽然是阿拉伯联合酋长国的首都,但它不是最大的城市;迪拜是。您还会注意到印第安纳波利斯有两个时区。不过,前者只是后者的别名。

时区数据库中使用的城市名称是剥离任何重音的英文名称(如果存在)。当名称有两个或三个单词时,它们用下划线而不是空格分隔。所以SãoTomé成为了SaoTome。因此在代码中我正在执行此转换。剥离重音的方法取自另一个Stack Overflow答案,链接如下。

链接

© www.soinside.com 2019 - 2024. All rights reserved.