需要基于ISO国家/地区代码和Java中城市的时区

时间:2019-10-11 13:59:57

标签: timezone

我的要求

::::要同时根据城市和国家/地区代码查找时区。请分享有没有找到它的方法?我不想只跟城市一起去,因为一个城市可以存在于两个或多个国家中。

即使在城市基地上,如果我进入利兹(英国城市),我也可以找到时区,但不能找到所有城市的时区,它什么也没有。

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


    String cityName = Normalizer.normalize(city, Normalizer.Form.NFKD).replaceAll("[^\\p{ASCII}-_ ]", "")
            .replace(' ', '_');

    List<String> possibleTimeZones = availableTimeZones.stream().filter(zid -> zid.endsWith("/" + cityName))
            .collect(Collectors.toList());

1 个答案:

答案 0 :(得分:0)

Rough way I found to achieve is -

private static String getSourceLocalTimeZone(String countryCode, String city, String sourceLocalTimeZone) {
        String[] timeZones = com.ibm.icu.util.TimeZone.getAvailableIDs(countryCode);

        for (String timeZone : timeZones) {
            String cityFromTimeZone = null;
            String[] value = timeZone.split("/");
            if (value != null && value.length > 0) {
                cityFromTimeZone = value[value.length - 1].replace("_", " ");
            }
            if (city!=null && city.matches("(.*)" + cityFromTimeZone + "(.*)")) {
                sourceLocalTimeZone = timeZone;
                break;
            }

        }
        if (sourceLocalTimeZone == null || (sourceLocalTimeZone.isEmpty())) {
            if(timeZones.length>0)
            sourceLocalTimeZone = timeZones[0];
        }
        return sourceLocalTimeZone;
    }

Dependency -
<dependency>
            <groupId>com.ibm.icu</groupId>
            <artifactId>icu4j</artifactId>
            <version>4.6</version>
        </dependency>