Разрешить пользователю выбирать часовой пояс - PullRequest
0 голосов
/ 13 декабря 2018

Я пишу Java-приложение, в котором пользователь должен иметь возможность выбирать свой часовой пояс.Я перечислил все доступные с TimeZone.getAvailableIDs (), который дал 627 строк.Очевидно, я не буду просить пользователя выбирать из этого.Как мне охватить все часовые пояса + использовать правильное летнее время, когда это применимо, с минимальным количеством вариантов выбора?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Задумывались ли вы об упрощении вещей и использовании UTC ?Я видел много сайтов, которые заинтересованы в часовом поясе пользователя, использующего это.Это должно уменьшить его примерно до 24 вариантов (есть некоторые особые случаи, которые могут увеличить его до ~ 40, если вы обеспокоены обслуживанием в каждой стране, и 30 минут для пары не вариант).Тогда единственное соображение - спросить их, соблюдают ли они летнее время.Реализация, которая будет включать в себя учет полушарий.

0 голосов
/ 13 декабря 2018
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...