允许用户选择时区

时间:2018-12-13 09:35:34

标签: java date time timezone

我正在编写一个Java应用程序,用户可以在其中选择自己的时区。我列出了所有可用的TimeZone.getAvailableIDs(),它返回了627行。显然,我不会要求用户从中进行选择。我应该如何覆盖所有时区,并在适用的情况下以最少的选择量使用正确的夏令时?

2 个答案:

答案 0 :(得分:0)

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class MainClass {

    public static void main(String[] argv) {

        Map<String, String> sortedMap = new LinkedHashMap<>();

        List<String> zoneList = new ArrayList<>(ZoneId.getAvailableZoneIds());

        // Get all ZoneIds
        Map<String, String> allZoneIds = getAllZoneIds(zoneList);

        // sort by value, descending order, use values as keys and vice versa
        allZoneIds.entrySet().stream().sorted(Map.Entry.<String, String>comparingByValue().reversed())
                .forEachOrdered(e -> sortedMap.put(e.getValue(), e.getKey()));

        // print map
        sortedMap.forEach((k, v) -> {
            String out = String.format("%5s (UTC%s) %n", k, v);
            System.out.printf(out);
        });
    }

    private static Map<String, String> getAllZoneIds(List<String> zoneList) {

        Map<String, String> result = new HashMap<>();

        LocalDateTime dt = LocalDateTime.now();

        for (String zoneId : zoneList) {

            ZoneId zone = ZoneId.of(zoneId);
            ZonedDateTime zdt = dt.atZone(zone);
            ZoneOffset zos = zdt.getOffset();

            // replace Z to +00:00
            String offset = zos.getId().replaceAll("Z", "+00:00");
            result.put(zone.toString(), offset);

        }
        return result;
    }
}

基于:https://www.mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset/

在创建时区图时,我将键替换为值,因此我们将UTC差异作为键。

这将输出:

-12:00 (UTCEtc/GMT+12) 
-11:00 (UTCPacific/Midway) 
-10:00 (UTCEtc/GMT+10) 
-09:30 (UTCPacific/Marquesas) 
-09:00 (UTCSystemV/YST9YDT) 
-08:00 (UTCUS/Pacific) 
-07:00 (UTCAmerica/Shiprock) 
-06:00 (UTCAmerica/Winnipeg) 
-05:00 (UTCSystemV/EST5EDT) 
-04:00 (UTCSystemV/AST4ADT) 
-03:30 (UTCCanada/Newfoundland) 
-03:00 (UTCAmerica/Argentina/Buenos_Aires) 
-02:00 (UTCAtlantic/South_Georgia) 
-01:00 (UTCAmerica/Scoresbysund) 
+14:00 (UTCEtc/GMT-14) 
+13:45 (UTCPacific/Chatham) 
+13:00 (UTCEtc/GMT-13) 
+12:00 (UTCPacific/Majuro) 
+11:00 (UTCPacific/Guadalcanal) 
+10:30 (UTCAustralia/South) 
+10:00 (UTCAustralia/Lindeman) 
+09:30 (UTCAustralia/Darwin) 
+09:00 (UTCAsia/Tokyo) 
+08:45 (UTCAustralia/Eucla) 
+08:30 (UTCAsia/Pyongyang) 
+08:00 (UTCAsia/Singapore) 
+07:00 (UTCAsia/Saigon) 
+06:30 (UTCIndian/Cocos) 
+06:00 (UTCAsia/Thimphu) 
+05:45 (UTCAsia/Katmandu) 
+05:30 (UTCAsia/Calcutta) 
+05:00 (UTCIndian/Kerguelen) 
+04:30 (UTCAsia/Kabul) 
+04:00 (UTCEurope/Ulyanovsk) 
+03:30 (UTCAsia/Tehran) 
+03:00 (UTCW-SU) 
+02:00 (UTCEurope/Athens) 
+01:00 (UTCEurope/Monaco) 
+00:00 (UTCEtc/UTC)

答案 1 :(得分:0)

您是否考虑过简化事情并使用UTC?我已经看到许多对用户所在时区感兴趣的网站。这样可以将其减少到大约24个选项(在某些特殊情况下,如果您担心为每个国家/地区提供服务,则可能会将其增加到40个左右,而一对夫妇则只有30分钟的选择时间)。然后,唯一的考虑就是询问他们是否遵守夏令时。实施该计划需要考虑到半球。