Table of Contents
ToggleJava ZoneId Methods - Java 147
處在不同的地球位置,看見太陽的角度是不同,正對太陽的地區是白天,背對太陽的地區則是處於黑夜,生活中使用的是地理時區,是根據國家或者地區規定使用同一個時區的區域,使用在 LocalDateTime 和 Instant 之間轉換的規則,支援兩種類型格式初始化,地理區域及時區偏移格式,介紹常見的 of 、 ofOffset 、 from 等方法, ZoneId Java Methods 本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- datetime
| +- zoneid
| +- ZoneIdMethodsTest.java
單元測試
ZoneId Methods Java 提供建立、取得等操作 ZoneId 。
getAvailableZoneIds
ZoneId Methods Java 取得所有時區列表。
@Test
public void getAvailableZoneIds() {
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
Map<String, String> result = sortZone(zoneIds);
result.forEach((k, v) -> System.out.println(String.format("%-36s (UTC%s)", k, v)));
System.out.println("----------");
System.out.println("size: " + zoneIds.size());
assertTrue(zoneIds.size() > 0);
}
public Map<String, String> sortZone(Set<String> zoneIds) {
Map<String, String> result = new LinkedHashMap<>();
Map<String, List<String>> map = new HashMap<>();
LocalDateTime localDateTime = LocalDateTime.now();
zoneIds.forEach(e -> {
ZoneId zone = ZoneId.of(e);
ZonedDateTime zonedDateTime = localDateTime.atZone(zone);
ZoneOffset zoneOffset = zonedDateTime.getOffset();
String offset = zoneOffset.getId().replaceAll("Z", "+00:00");
List<String> regionList = map.computeIfAbsent(offset, k -> new ArrayList<>());
regionList.add(e);
});
for (List<String> list : map.values()) {
list.sort(Comparator.comparing(e -> e, (o, o2) -> o.compareTo(o2)));
}
map.entrySet().stream().sorted(Map.Entry.<String, List<String>>comparingByKey().reversed()).forEach((e) -> {
String offset = e.getKey();
List<String> ids = e.getValue();
ids.forEach(id -> result.put(id, offset));
});
return result;
}
Etc/GMT+12 (UTC-12:00)
Etc/GMT+11 (UTC-11:00)
Pacific/Midway (UTC-11:00)
Pacific/Niue (UTC-11:00)
Pacific/Pago_Pago (UTC-11:00)
Pacific/Samoa (UTC-11:00)
US/Samoa (UTC-11:00)
Etc/GMT+10 (UTC-10:00)
Pacific/Honolulu (UTC-10:00)
Pacific/Johnston (UTC-10:00)
Pacific/Rarotonga (UTC-10:00)
Pacific/Tahiti (UTC-10:00)
SystemV/HST10 (UTC-10:00)
US/Hawaii (UTC-10:00)
Pacific/Marquesas (UTC-09:30)
America/Adak (UTC-09:00)
America/Atka (UTC-09:00)
Etc/GMT+9 (UTC-09:00)
Pacific/Gambier (UTC-09:00)
SystemV/YST9 (UTC-09:00)
US/Aleutian (UTC-09:00)
America/Anchorage (UTC-08:00)
America/Juneau (UTC-08:00)
America/Metlakatla (UTC-08:00)
America/Nome (UTC-08:00)
America/Sitka (UTC-08:00)
America/Yakutat (UTC-08:00)
Etc/GMT+8 (UTC-08:00)
Pacific/Pitcairn (UTC-08:00)
SystemV/PST8 (UTC-08:00)
SystemV/YST9YDT (UTC-08:00)
US/Alaska (UTC-08:00)
America/Creston (UTC-07:00)
America/Dawson (UTC-07:00)
America/Dawson_Creek (UTC-07:00)
America/Ensenada (UTC-07:00)
America/Fort_Nelson (UTC-07:00)
America/Hermosillo (UTC-07:00)
America/Los_Angeles (UTC-07:00)
America/Phoenix (UTC-07:00)
America/Santa_Isabel (UTC-07:00)
America/Tijuana (UTC-07:00)
America/Vancouver (UTC-07:00)
America/Whitehorse (UTC-07:00)
Canada/Pacific (UTC-07:00)
Canada/Yukon (UTC-07:00)
Etc/GMT+7 (UTC-07:00)
Mexico/BajaNorte (UTC-07:00)
PST8PDT (UTC-07:00)
SystemV/MST7 (UTC-07:00)
SystemV/PST8PDT (UTC-07:00)
US/Arizona (UTC-07:00)
US/Pacific (UTC-07:00)
US/Pacific-New (UTC-07:00)
America/Belize (UTC-06:00)
America/Boise (UTC-06:00)
America/Cambridge_Bay (UTC-06:00)
America/Chihuahua (UTC-06:00)
America/Costa_Rica (UTC-06:00)
America/Denver (UTC-06:00)
America/Edmonton (UTC-06:00)
America/El_Salvador (UTC-06:00)
America/Guatemala (UTC-06:00)
America/Inuvik (UTC-06:00)
America/Managua (UTC-06:00)
America/Mazatlan (UTC-06:00)
America/Ojinaga (UTC-06:00)
America/Regina (UTC-06:00)
America/Shiprock (UTC-06:00)
America/Swift_Current (UTC-06:00)
America/Tegucigalpa (UTC-06:00)
America/Yellowknife (UTC-06:00)
Canada/Mountain (UTC-06:00)
Canada/Saskatchewan (UTC-06:00)
Chile/EasterIsland (UTC-06:00)
Etc/GMT+6 (UTC-06:00)
MST7MDT (UTC-06:00)
Mexico/BajaSur (UTC-06:00)
Navajo (UTC-06:00)
Pacific/Easter (UTC-06:00)
Pacific/Galapagos (UTC-06:00)
SystemV/CST6 (UTC-06:00)
SystemV/MST7MDT (UTC-06:00)
US/Mountain (UTC-06:00)
America/Atikokan (UTC-05:00)
America/Bahia_Banderas (UTC-05:00)
America/Bogota (UTC-05:00)
America/Cancun (UTC-05:00)
America/Cayman (UTC-05:00)
America/Chicago (UTC-05:00)
America/Coral_Harbour (UTC-05:00)
America/Eirunepe (UTC-05:00)
America/Guayaquil (UTC-05:00)
America/Indiana/Knox (UTC-05:00)
America/Indiana/Tell_City (UTC-05:00)
America/Jamaica (UTC-05:00)
America/Knox_IN (UTC-05:00)
America/Lima (UTC-05:00)
America/Matamoros (UTC-05:00)
America/Menominee (UTC-05:00)
America/Merida (UTC-05:00)
America/Mexico_City (UTC-05:00)
America/Monterrey (UTC-05:00)
America/North_Dakota/Beulah (UTC-05:00)
America/North_Dakota/Center (UTC-05:00)
America/North_Dakota/New_Salem (UTC-05:00)
America/Panama (UTC-05:00)
America/Porto_Acre (UTC-05:00)
America/Rainy_River (UTC-05:00)
America/Rankin_Inlet (UTC-05:00)
America/Resolute (UTC-05:00)
America/Rio_Branco (UTC-05:00)
America/Winnipeg (UTC-05:00)
Brazil/Acre (UTC-05:00)
CST6CDT (UTC-05:00)
Canada/Central (UTC-05:00)
Etc/GMT+5 (UTC-05:00)
Jamaica (UTC-05:00)
Mexico/General (UTC-05:00)
SystemV/CST6CDT (UTC-05:00)
SystemV/EST5 (UTC-05:00)
US/Central (UTC-05:00)
US/Indiana-Starke (UTC-05:00)
America/Anguilla (UTC-04:00)
America/Antigua (UTC-04:00)
America/Aruba (UTC-04:00)
America/Asuncion (UTC-04:00)
America/Barbados (UTC-04:00)
America/Blanc-Sablon (UTC-04:00)
America/Boa_Vista (UTC-04:00)
America/Campo_Grande (UTC-04:00)
America/Caracas (UTC-04:00)
America/Cuiaba (UTC-04:00)
America/Curacao (UTC-04:00)
America/Detroit (UTC-04:00)
America/Dominica (UTC-04:00)
America/Fort_Wayne (UTC-04:00)
America/Grand_Turk (UTC-04:00)
America/Grenada (UTC-04:00)
America/Guadeloupe (UTC-04:00)
America/Guyana (UTC-04:00)
America/Havana (UTC-04:00)
America/Indiana/Indianapolis (UTC-04:00)
America/Indiana/Marengo (UTC-04:00)
America/Indiana/Petersburg (UTC-04:00)
America/Indiana/Vevay (UTC-04:00)
America/Indiana/Vincennes (UTC-04:00)
America/Indiana/Winamac (UTC-04:00)
America/Indianapolis (UTC-04:00)
America/Iqaluit (UTC-04:00)
America/Kentucky/Louisville (UTC-04:00)
America/Kentucky/Monticello (UTC-04:00)
America/Kralendijk (UTC-04:00)
America/La_Paz (UTC-04:00)
America/Louisville (UTC-04:00)
America/Lower_Princes (UTC-04:00)
America/Manaus (UTC-04:00)
America/Marigot (UTC-04:00)
America/Martinique (UTC-04:00)
America/Montreal (UTC-04:00)
America/Montserrat (UTC-04:00)
America/Nassau (UTC-04:00)
America/New_York (UTC-04:00)
America/Nipigon (UTC-04:00)
America/Pangnirtung (UTC-04:00)
America/Port-au-Prince (UTC-04:00)
America/Port_of_Spain (UTC-04:00)
America/Porto_Velho (UTC-04:00)
America/Puerto_Rico (UTC-04:00)
America/Santiago (UTC-04:00)
America/Santo_Domingo (UTC-04:00)
America/St_Barthelemy (UTC-04:00)
America/St_Kitts (UTC-04:00)
America/St_Lucia (UTC-04:00)
America/St_Thomas (UTC-04:00)
America/St_Vincent (UTC-04:00)
America/Thunder_Bay (UTC-04:00)
America/Toronto (UTC-04:00)
America/Tortola (UTC-04:00)
America/Virgin (UTC-04:00)
Brazil/West (UTC-04:00)
Canada/Eastern (UTC-04:00)
Chile/Continental (UTC-04:00)
Cuba (UTC-04:00)
EST5EDT (UTC-04:00)
Etc/GMT+4 (UTC-04:00)
SystemV/AST4 (UTC-04:00)
SystemV/EST5EDT (UTC-04:00)
US/East-Indiana (UTC-04:00)
US/Eastern (UTC-04:00)
US/Michigan (UTC-04:00)
America/Araguaina (UTC-03:00)
America/Argentina/Buenos_Aires (UTC-03:00)
America/Argentina/Catamarca (UTC-03:00)
America/Argentina/ComodRivadavia (UTC-03:00)
America/Argentina/Cordoba (UTC-03:00)
America/Argentina/Jujuy (UTC-03:00)
America/Argentina/La_Rioja (UTC-03:00)
America/Argentina/Mendoza (UTC-03:00)
America/Argentina/Rio_Gallegos (UTC-03:00)
America/Argentina/Salta (UTC-03:00)
America/Argentina/San_Juan (UTC-03:00)
America/Argentina/San_Luis (UTC-03:00)
America/Argentina/Tucuman (UTC-03:00)
America/Argentina/Ushuaia (UTC-03:00)
America/Bahia (UTC-03:00)
America/Belem (UTC-03:00)
America/Buenos_Aires (UTC-03:00)
America/Catamarca (UTC-03:00)
America/Cayenne (UTC-03:00)
America/Cordoba (UTC-03:00)
America/Fortaleza (UTC-03:00)
America/Glace_Bay (UTC-03:00)
America/Goose_Bay (UTC-03:00)
America/Halifax (UTC-03:00)
America/Jujuy (UTC-03:00)
America/Maceio (UTC-03:00)
America/Mendoza (UTC-03:00)
America/Moncton (UTC-03:00)
America/Montevideo (UTC-03:00)
America/Paramaribo (UTC-03:00)
America/Punta_Arenas (UTC-03:00)
America/Recife (UTC-03:00)
America/Rosario (UTC-03:00)
America/Santarem (UTC-03:00)
America/Sao_Paulo (UTC-03:00)
America/Thule (UTC-03:00)
Antarctica/Palmer (UTC-03:00)
Antarctica/Rothera (UTC-03:00)
Atlantic/Bermuda (UTC-03:00)
Atlantic/Stanley (UTC-03:00)
Brazil/East (UTC-03:00)
Canada/Atlantic (UTC-03:00)
Etc/GMT+3 (UTC-03:00)
SystemV/AST4ADT (UTC-03:00)
America/St_Johns (UTC-02:30)
Canada/Newfoundland (UTC-02:30)
America/Godthab (UTC-02:00)
America/Miquelon (UTC-02:00)
America/Noronha (UTC-02:00)
Atlantic/South_Georgia (UTC-02:00)
Brazil/DeNoronha (UTC-02:00)
Etc/GMT+2 (UTC-02:00)
Atlantic/Cape_Verde (UTC-01:00)
Etc/GMT+1 (UTC-01:00)
Etc/GMT-14 (UTC+14:00)
Pacific/Kiritimati (UTC+14:00)
Etc/GMT-13 (UTC+13:00)
Pacific/Apia (UTC+13:00)
Pacific/Enderbury (UTC+13:00)
Pacific/Fakaofo (UTC+13:00)
Pacific/Tongatapu (UTC+13:00)
NZ-CHAT (UTC+12:45)
Pacific/Chatham (UTC+12:45)
Antarctica/McMurdo (UTC+12:00)
Antarctica/South_Pole (UTC+12:00)
Asia/Anadyr (UTC+12:00)
Asia/Kamchatka (UTC+12:00)
Etc/GMT-12 (UTC+12:00)
Kwajalein (UTC+12:00)
NZ (UTC+12:00)
Pacific/Auckland (UTC+12:00)
Pacific/Fiji (UTC+12:00)
Pacific/Funafuti (UTC+12:00)
Pacific/Kwajalein (UTC+12:00)
Pacific/Majuro (UTC+12:00)
Pacific/Nauru (UTC+12:00)
Pacific/Tarawa (UTC+12:00)
Pacific/Wake (UTC+12:00)
Pacific/Wallis (UTC+12:00)
Antarctica/Macquarie (UTC+11:00)
Asia/Magadan (UTC+11:00)
Asia/Sakhalin (UTC+11:00)
Asia/Srednekolymsk (UTC+11:00)
Etc/GMT-11 (UTC+11:00)
Pacific/Bougainville (UTC+11:00)
Pacific/Efate (UTC+11:00)
Pacific/Guadalcanal (UTC+11:00)
Pacific/Kosrae (UTC+11:00)
Pacific/Norfolk (UTC+11:00)
Pacific/Noumea (UTC+11:00)
Pacific/Pohnpei (UTC+11:00)
Pacific/Ponape (UTC+11:00)
Australia/LHI (UTC+10:30)
Australia/Lord_Howe (UTC+10:30)
Antarctica/DumontDUrville (UTC+10:00)
Asia/Ust-Nera (UTC+10:00)
Asia/Vladivostok (UTC+10:00)
Australia/ACT (UTC+10:00)
Australia/Brisbane (UTC+10:00)
Australia/Canberra (UTC+10:00)
Australia/Currie (UTC+10:00)
Australia/Hobart (UTC+10:00)
Australia/Lindeman (UTC+10:00)
Australia/Melbourne (UTC+10:00)
Australia/NSW (UTC+10:00)
Australia/Queensland (UTC+10:00)
Australia/Sydney (UTC+10:00)
Australia/Tasmania (UTC+10:00)
Australia/Victoria (UTC+10:00)
Etc/GMT-10 (UTC+10:00)
Pacific/Chuuk (UTC+10:00)
Pacific/Guam (UTC+10:00)
Pacific/Port_Moresby (UTC+10:00)
Pacific/Saipan (UTC+10:00)
Pacific/Truk (UTC+10:00)
Pacific/Yap (UTC+10:00)
Australia/Adelaide (UTC+09:30)
Australia/Broken_Hill (UTC+09:30)
Australia/Darwin (UTC+09:30)
Australia/North (UTC+09:30)
Australia/South (UTC+09:30)
Australia/Yancowinna (UTC+09:30)
Asia/Chita (UTC+09:00)
Asia/Dili (UTC+09:00)
Asia/Jayapura (UTC+09:00)
Asia/Khandyga (UTC+09:00)
Asia/Pyongyang (UTC+09:00)
Asia/Seoul (UTC+09:00)
Asia/Tokyo (UTC+09:00)
Asia/Yakutsk (UTC+09:00)
Etc/GMT-9 (UTC+09:00)
Japan (UTC+09:00)
Pacific/Palau (UTC+09:00)
ROK (UTC+09:00)
Australia/Eucla (UTC+08:45)
Antarctica/Casey (UTC+08:00)
Asia/Brunei (UTC+08:00)
Asia/Choibalsan (UTC+08:00)
Asia/Chongqing (UTC+08:00)
Asia/Chungking (UTC+08:00)
Asia/Harbin (UTC+08:00)
Asia/Hong_Kong (UTC+08:00)
Asia/Irkutsk (UTC+08:00)
Asia/Kuala_Lumpur (UTC+08:00)
Asia/Kuching (UTC+08:00)
Asia/Macao (UTC+08:00)
Asia/Macau (UTC+08:00)
Asia/Makassar (UTC+08:00)
Asia/Manila (UTC+08:00)
Asia/Shanghai (UTC+08:00)
Asia/Singapore (UTC+08:00)
Asia/Taipei (UTC+08:00)
Asia/Ujung_Pandang (UTC+08:00)
Asia/Ulaanbaatar (UTC+08:00)
Asia/Ulan_Bator (UTC+08:00)
Australia/Perth (UTC+08:00)
Australia/West (UTC+08:00)
Etc/GMT-8 (UTC+08:00)
Hongkong (UTC+08:00)
PRC (UTC+08:00)
Singapore (UTC+08:00)
Antarctica/Davis (UTC+07:00)
Asia/Bangkok (UTC+07:00)
Asia/Barnaul (UTC+07:00)
Asia/Ho_Chi_Minh (UTC+07:00)
Asia/Hovd (UTC+07:00)
Asia/Jakarta (UTC+07:00)
Asia/Krasnoyarsk (UTC+07:00)
Asia/Novokuznetsk (UTC+07:00)
Asia/Novosibirsk (UTC+07:00)
Asia/Phnom_Penh (UTC+07:00)
Asia/Pontianak (UTC+07:00)
Asia/Saigon (UTC+07:00)
Asia/Tomsk (UTC+07:00)
Asia/Vientiane (UTC+07:00)
Etc/GMT-7 (UTC+07:00)
Indian/Christmas (UTC+07:00)
Asia/Rangoon (UTC+06:30)
Asia/Yangon (UTC+06:30)
Indian/Cocos (UTC+06:30)
Antarctica/Vostok (UTC+06:00)
Asia/Almaty (UTC+06:00)
Asia/Bishkek (UTC+06:00)
Asia/Dacca (UTC+06:00)
Asia/Dhaka (UTC+06:00)
Asia/Kashgar (UTC+06:00)
Asia/Omsk (UTC+06:00)
Asia/Qostanay (UTC+06:00)
Asia/Thimbu (UTC+06:00)
Asia/Thimphu (UTC+06:00)
Asia/Urumqi (UTC+06:00)
Etc/GMT-6 (UTC+06:00)
Indian/Chagos (UTC+06:00)
Asia/Kathmandu (UTC+05:45)
Asia/Katmandu (UTC+05:45)
Asia/Calcutta (UTC+05:30)
Asia/Colombo (UTC+05:30)
Asia/Kolkata (UTC+05:30)
Antarctica/Mawson (UTC+05:00)
Asia/Aqtau (UTC+05:00)
Asia/Aqtobe (UTC+05:00)
Asia/Ashgabat (UTC+05:00)
Asia/Ashkhabad (UTC+05:00)
Asia/Atyrau (UTC+05:00)
Asia/Dushanbe (UTC+05:00)
Asia/Karachi (UTC+05:00)
Asia/Oral (UTC+05:00)
Asia/Qyzylorda (UTC+05:00)
Asia/Samarkand (UTC+05:00)
Asia/Tashkent (UTC+05:00)
Asia/Yekaterinburg (UTC+05:00)
Etc/GMT-5 (UTC+05:00)
Indian/Kerguelen (UTC+05:00)
Indian/Maldives (UTC+05:00)
Asia/Kabul (UTC+04:30)
Asia/Tehran (UTC+04:30)
Iran (UTC+04:30)
Asia/Baku (UTC+04:00)
Asia/Dubai (UTC+04:00)
Asia/Muscat (UTC+04:00)
Asia/Tbilisi (UTC+04:00)
Asia/Yerevan (UTC+04:00)
Etc/GMT-4 (UTC+04:00)
Europe/Astrakhan (UTC+04:00)
Europe/Samara (UTC+04:00)
Europe/Saratov (UTC+04:00)
Europe/Ulyanovsk (UTC+04:00)
Europe/Volgograd (UTC+04:00)
Indian/Mahe (UTC+04:00)
Indian/Mauritius (UTC+04:00)
Indian/Reunion (UTC+04:00)
Africa/Addis_Ababa (UTC+03:00)
Africa/Asmara (UTC+03:00)
Africa/Asmera (UTC+03:00)
Africa/Dar_es_Salaam (UTC+03:00)
Africa/Djibouti (UTC+03:00)
Africa/Juba (UTC+03:00)
Africa/Kampala (UTC+03:00)
Africa/Mogadishu (UTC+03:00)
Africa/Nairobi (UTC+03:00)
Antarctica/Syowa (UTC+03:00)
Asia/Aden (UTC+03:00)
Asia/Amman (UTC+03:00)
Asia/Baghdad (UTC+03:00)
Asia/Bahrain (UTC+03:00)
Asia/Beirut (UTC+03:00)
Asia/Damascus (UTC+03:00)
Asia/Famagusta (UTC+03:00)
Asia/Gaza (UTC+03:00)
Asia/Hebron (UTC+03:00)
Asia/Istanbul (UTC+03:00)
Asia/Jerusalem (UTC+03:00)
Asia/Kuwait (UTC+03:00)
Asia/Nicosia (UTC+03:00)
Asia/Qatar (UTC+03:00)
Asia/Riyadh (UTC+03:00)
Asia/Tel_Aviv (UTC+03:00)
EET (UTC+03:00)
Etc/GMT-3 (UTC+03:00)
Europe/Athens (UTC+03:00)
Europe/Bucharest (UTC+03:00)
Europe/Chisinau (UTC+03:00)
Europe/Helsinki (UTC+03:00)
Europe/Istanbul (UTC+03:00)
Europe/Kiev (UTC+03:00)
Europe/Kirov (UTC+03:00)
Europe/Mariehamn (UTC+03:00)
Europe/Minsk (UTC+03:00)
Europe/Moscow (UTC+03:00)
Europe/Nicosia (UTC+03:00)
Europe/Riga (UTC+03:00)
Europe/Simferopol (UTC+03:00)
Europe/Sofia (UTC+03:00)
Europe/Tallinn (UTC+03:00)
Europe/Tiraspol (UTC+03:00)
Europe/Uzhgorod (UTC+03:00)
Europe/Vilnius (UTC+03:00)
Europe/Zaporozhye (UTC+03:00)
Indian/Antananarivo (UTC+03:00)
Indian/Comoro (UTC+03:00)
Indian/Mayotte (UTC+03:00)
Israel (UTC+03:00)
Turkey (UTC+03:00)
W-SU (UTC+03:00)
Africa/Blantyre (UTC+02:00)
Africa/Bujumbura (UTC+02:00)
Africa/Cairo (UTC+02:00)
Africa/Ceuta (UTC+02:00)
Africa/Gaborone (UTC+02:00)
Africa/Harare (UTC+02:00)
Africa/Johannesburg (UTC+02:00)
Africa/Khartoum (UTC+02:00)
Africa/Kigali (UTC+02:00)
Africa/Lubumbashi (UTC+02:00)
Africa/Lusaka (UTC+02:00)
Africa/Maputo (UTC+02:00)
Africa/Maseru (UTC+02:00)
Africa/Mbabane (UTC+02:00)
Africa/Tripoli (UTC+02:00)
Africa/Windhoek (UTC+02:00)
Antarctica/Troll (UTC+02:00)
Arctic/Longyearbyen (UTC+02:00)
Atlantic/Jan_Mayen (UTC+02:00)
CET (UTC+02:00)
Egypt (UTC+02:00)
Etc/GMT-2 (UTC+02:00)
Europe/Amsterdam (UTC+02:00)
Europe/Andorra (UTC+02:00)
Europe/Belgrade (UTC+02:00)
Europe/Berlin (UTC+02:00)
Europe/Bratislava (UTC+02:00)
Europe/Brussels (UTC+02:00)
Europe/Budapest (UTC+02:00)
Europe/Busingen (UTC+02:00)
Europe/Copenhagen (UTC+02:00)
Europe/Gibraltar (UTC+02:00)
Europe/Kaliningrad (UTC+02:00)
Europe/Ljubljana (UTC+02:00)
Europe/Luxembourg (UTC+02:00)
Europe/Madrid (UTC+02:00)
Europe/Malta (UTC+02:00)
Europe/Monaco (UTC+02:00)
Europe/Oslo (UTC+02:00)
Europe/Paris (UTC+02:00)
Europe/Podgorica (UTC+02:00)
Europe/Prague (UTC+02:00)
Europe/Rome (UTC+02:00)
Europe/San_Marino (UTC+02:00)
Europe/Sarajevo (UTC+02:00)
Europe/Skopje (UTC+02:00)
Europe/Stockholm (UTC+02:00)
Europe/Tirane (UTC+02:00)
Europe/Vaduz (UTC+02:00)
Europe/Vatican (UTC+02:00)
Europe/Vienna (UTC+02:00)
Europe/Warsaw (UTC+02:00)
Europe/Zagreb (UTC+02:00)
Europe/Zurich (UTC+02:00)
Libya (UTC+02:00)
MET (UTC+02:00)
Poland (UTC+02:00)
Africa/Algiers (UTC+01:00)
Africa/Bangui (UTC+01:00)
Africa/Brazzaville (UTC+01:00)
Africa/Casablanca (UTC+01:00)
Africa/Douala (UTC+01:00)
Africa/El_Aaiun (UTC+01:00)
Africa/Kinshasa (UTC+01:00)
Africa/Lagos (UTC+01:00)
Africa/Libreville (UTC+01:00)
Africa/Luanda (UTC+01:00)
Africa/Malabo (UTC+01:00)
Africa/Ndjamena (UTC+01:00)
Africa/Niamey (UTC+01:00)
Africa/Porto-Novo (UTC+01:00)
Africa/Tunis (UTC+01:00)
Atlantic/Canary (UTC+01:00)
Atlantic/Faeroe (UTC+01:00)
Atlantic/Faroe (UTC+01:00)
Atlantic/Madeira (UTC+01:00)
Eire (UTC+01:00)
Etc/GMT-1 (UTC+01:00)
Europe/Belfast (UTC+01:00)
Europe/Dublin (UTC+01:00)
Europe/Guernsey (UTC+01:00)
Europe/Isle_of_Man (UTC+01:00)
Europe/Jersey (UTC+01:00)
Europe/Lisbon (UTC+01:00)
Europe/London (UTC+01:00)
GB (UTC+01:00)
GB-Eire (UTC+01:00)
Portugal (UTC+01:00)
WET (UTC+01:00)
Africa/Abidjan (UTC+00:00)
Africa/Accra (UTC+00:00)
Africa/Bamako (UTC+00:00)
Africa/Banjul (UTC+00:00)
Africa/Bissau (UTC+00:00)
Africa/Conakry (UTC+00:00)
Africa/Dakar (UTC+00:00)
Africa/Freetown (UTC+00:00)
Africa/Lome (UTC+00:00)
Africa/Monrovia (UTC+00:00)
Africa/Nouakchott (UTC+00:00)
Africa/Ouagadougou (UTC+00:00)
Africa/Sao_Tome (UTC+00:00)
Africa/Timbuktu (UTC+00:00)
America/Danmarkshavn (UTC+00:00)
America/Scoresbysund (UTC+00:00)
Atlantic/Azores (UTC+00:00)
Atlantic/Reykjavik (UTC+00:00)
Atlantic/St_Helena (UTC+00:00)
Etc/GMT (UTC+00:00)
Etc/GMT+0 (UTC+00:00)
Etc/GMT-0 (UTC+00:00)
Etc/GMT0 (UTC+00:00)
Etc/Greenwich (UTC+00:00)
Etc/UCT (UTC+00:00)
Etc/UTC (UTC+00:00)
Etc/Universal (UTC+00:00)
Etc/Zulu (UTC+00:00)
GMT (UTC+00:00)
GMT0 (UTC+00:00)
Greenwich (UTC+00:00)
Iceland (UTC+00:00)
UCT (UTC+00:00)
UTC (UTC+00:00)
Universal (UTC+00:00)
Zulu (UTC+00:00)
----------
size: 600
systemDefault
ZoneId Methods Java 建立一個 ZoneId ,取得系統預設時區。
@Test
public void systemDefault() {
ZoneId zone = ZoneId.systemDefault();
System.out.println(zone);
System.out.println(zone.getRules());
LocalDateTime localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
}
Asia/Taipei
ZoneRules[currentStandardOffset=+08:00]
2023-06-21T17:20:30.976
getDisplayName
ZoneId Methods Java 建立一個 ZoneId ,取得各種不同格式的顯示名稱。
@Test
public void getDisplayName() {
ZoneId zone = ZoneId.of("Australia/Sydney");
System.out.println(zone);
assertEquals("Australia/Sydney", zone.getId());
String result = zone.getDisplayName(TextStyle.FULL, Locale.ROOT);
System.out.println(result);
assertEquals("Australian Eastern Time (New South Wales)", result);
result = zone.getDisplayName(TextStyle.SHORT, Locale.ROOT);
System.out.println(result);
assertEquals("AET", result);
result = zone.getDisplayName(TextStyle.NARROW, Locale.ROOT);
System.out.println(result);
assertEquals("Australia/Sydney", result);
}
Australia/Sydney
Australian Eastern Time (New South Wales)
AET
Australia/Sydney
of
ZoneId Methods Java 建立一個 ZoneId ,建立指定時區及日期時間。
@Test
public void of() {
ZoneId zone = ZoneId.of("Australia/Sydney");
System.out.println(zone);
assertEquals("Australia/Sydney", zone.getId());
LocalDateTime localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.of("+10");
System.out.println(zone);
assertEquals("+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.of("UTC+10");
System.out.println(zone);
assertEquals("UTC+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.of("GMT+10");
System.out.println(zone);
assertEquals("GMT+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.of("Etc/GMT-10");
System.out.println(zone);
assertEquals("Etc/GMT-10", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
}
Australia/Sydney
2023-06-21T19:24:53.450
+10:00
2023-06-21T19:24:53.550
UTC+10:00
2023-06-21T19:24:53.551
GMT+10:00
2023-06-21T19:24:53.551
Etc/GMT-10
2023-06-21T19:24:53.551
ofOffset
ZoneId Methods in Java 建立一個 ZoneId ,建立一個 ZoneId ,使用 ofOffset 建立指定時區及日期時間。
@Test
public void ofOffset() {
ZoneId zone = ZoneId.ofOffset("UTC", ZoneOffset.UTC);
System.out.println(zone);
assertEquals("UTC", zone.getId());
LocalDateTime localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.ofOffset("UTC", ZoneOffset.of("+10"));
System.out.println(zone);
assertEquals("UTC+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.ofOffset("UTC", ZoneOffset.of("+10:00"));
System.out.println(zone);
assertEquals("UTC+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.ofOffset("GMT", ZoneOffset.ofHours(10));
System.out.println(zone);
assertEquals("GMT+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
}
UTC
2023-06-21T09:26:11.275
UTC+10:00
2023-06-21T19:26:11.275
UTC+10:00
2023-06-21T19:26:11.275
GMT+10:00
2023-06-21T19:26:11.275
from
ZoneId Methods in Java 建立一個 ZoneId ,從 ZonedDateTime ,建立指定時區。
@Test
public void from() {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
ZoneId zone = ZoneId.from(zonedDateTime);
System.out.println(zone);
zonedDateTime = ZonedDateTime.parse("2023-12-25T00:00:00.000+10:00[Australia/Sydney]");
zone = ZoneId.from(zonedDateTime);
System.out.println(zone);
assertEquals("Australia/Sydney", zone.getId());
}
Asia/Taipei
Australia/Sydney
ZoneIdMethodsTest.java
ZoneId Methods in Java 新增單元測試,驗證 ZoneId Functions in Java 是否符合預期。
package org.ruoxue.java_147.datetime.zoneid;
import static org.junit.Assert.*;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.TextStyle;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class ZoneIdMethodsTest {
@Test
public void getAvailableZoneIds() {
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
Map<String, String> result = sortZone(zoneIds);
result.forEach((k, v) -> System.out.println(String.format("%-36s (UTC%s)", k, v)));
System.out.println("----------");
System.out.println("size: " + zoneIds.size());
assertTrue(zoneIds.size() > 0);
}
public Map<String, String> sortZone(Set<String> zoneIds) {
Map<String, String> result = new LinkedHashMap<>();
Map<String, List<String>> map = new HashMap<>();
LocalDateTime localDateTime = LocalDateTime.now();
zoneIds.forEach(e -> {
ZoneId zone = ZoneId.of(e);
ZonedDateTime zonedDateTime = localDateTime.atZone(zone);
ZoneOffset zoneOffset = zonedDateTime.getOffset();
String offset = zoneOffset.getId().replaceAll("Z", "+00:00");
List<String> regionList = map.computeIfAbsent(offset, k -> new ArrayList<>());
regionList.add(e);
});
for (List<String> list : map.values()) {
list.sort(Comparator.comparing(e -> e, (o, o2) -> o.compareTo(o2)));
}
map.entrySet().stream().sorted(Map.Entry.<String, List<String>>comparingByKey().reversed()).forEach((e) -> {
String offset = e.getKey();
List<String> ids = e.getValue();
ids.forEach(id -> result.put(id, offset));
});
return result;
}
@Test
public void systemDefault() {
ZoneId zone = ZoneId.systemDefault();
System.out.println(zone);
System.out.println(zone.getRules());
LocalDateTime localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
}
@Test
public void getDisplayName() {
ZoneId zone = ZoneId.of("Australia/Sydney");
System.out.println(zone);
assertEquals("Australia/Sydney", zone.getId());
String result = zone.getDisplayName(TextStyle.FULL, Locale.ROOT);
System.out.println(result);
assertEquals("Australian Eastern Time (New South Wales)", result);
result = zone.getDisplayName(TextStyle.SHORT, Locale.ROOT);
System.out.println(result);
assertEquals("AET", result);
result = zone.getDisplayName(TextStyle.NARROW, Locale.ROOT);
System.out.println(result);
assertEquals("Australia/Sydney", result);
}
@Test
public void of() {
ZoneId zone = ZoneId.of("Australia/Sydney");
System.out.println(zone);
assertEquals("Australia/Sydney", zone.getId());
LocalDateTime localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.of("+10");
System.out.println(zone);
assertEquals("+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.of("UTC+10");
System.out.println(zone);
assertEquals("UTC+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.of("GMT+10");
System.out.println(zone);
assertEquals("GMT+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.of("Etc/GMT-10");
System.out.println(zone);
assertEquals("Etc/GMT-10", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
}
@Test
public void ofOffset() {
ZoneId zone = ZoneId.ofOffset("UTC", ZoneOffset.UTC);
System.out.println(zone);
assertEquals("UTC", zone.getId());
LocalDateTime localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.ofOffset("UTC", ZoneOffset.of("+10"));
System.out.println(zone);
assertEquals("UTC+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.ofOffset("UTC", ZoneOffset.of("+10:00"));
System.out.println(zone);
assertEquals("UTC+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
zone = ZoneId.ofOffset("GMT", ZoneOffset.ofHours(10));
System.out.println(zone);
assertEquals("GMT+10:00", zone.getId());
localDateTime = LocalDateTime.now(zone);
System.out.println(localDateTime);
}
@Test
public void from() {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
ZoneId zone = ZoneId.from(zonedDateTime);
System.out.println(zone);
zonedDateTime = ZonedDateTime.parse("2023-12-25T00:00:00.000+10:00[Australia/Sydney]");
zone = ZoneId.from(zonedDateTime);
System.out.println(zone);
assertEquals("Australia/Sydney", zone.getId());
}
}
心得分享
ZoneId Functions in Java 現行的世界標準時間是 UTC 世界協調時間,時區已不直接參與時間計算,但是城市名稱或時區是人們所能記憶和容易溝通的名詞,分為 24 個不同的時區,不同的兩地存在時差, ZoneId Methods in Java 建立對照表,從城市名稱或時區查找偏移量,從而計算出當地的本地日期時間。