我正在编写一个Java应用程序,用户可以在其中选择自己的时区。我列出了所有可用的TimeZone.getAvailableIDs(),它返回了627行。显然,我不会要求用户从中进行选择。我应该如何覆盖所有时区,并在适用的情况下以最少的选择量使用正确的夏令时?
答案 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分钟的选择时间)。然后,唯一的考虑就是询问他们是否遵守夏令时。实施该计划需要考虑到半球。