Java ZoneId Methods - Java 147

Java ZoneId Methods – Java 147

Java 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 建立對照表,從城市名稱或時區查找偏移量,從而計算出當地的本地日期時間。

發佈留言