Many Java developers are not fond of Java’s standard APIs for handling Dates and Calendars. In fact, it is difficult to think of examples from the Java standard APIs that better illustrate the mistake of allowing ultimate and mostly unused flexibility to result in an unnecessarily high degree of pain for the vast majority of users of the API. One of the things a Java developer using Calendar may need to do is specify a particular TimeZone. The specification of a TimeZone is done via String-based TimeZone IDs. This blog post demonstrates getting these String-based IDs with both Java and Groovy.The TimeZone class provides a static method for getting an array of the Strings representing recognized TimeZone IDs. The availability of this method, TimeZone.getAvailableIDs(), allows a developer to programmatically access TimeZone IDs supported by the current JRE release or via Timezone Updater. I have blogged previously on the value of using simple Java tests. The next code listing is an example of just that and provides the available set of TimeZone IDs for a given environment.TimeZoneIds.java package dustin.examples; import java.util.Arrays; import java.util.TimeZone; import static java.lang.System.out; public class TimeZoneIds { public static void main(final String[] arguments) { out.println(Arrays.toString(TimeZone.getAvailableIDs())); } } Compiling and running the above class results in output like the following:[Etc/GMT+12, Etc/GMT+11, MIT, Pacific/Apia, Pacific/Midway, Pacific/Niue, Pacific/Pago_Pago, Pacific/Samoa, US/Samoa, America/Adak, America/Atka, Etc/GMT+10, HST, Pacific/Fakaofo, Pacific/Honolulu, Pacific/Johnston, Pacific/Rarotonga, Pacific/Tahiti, SystemV/HST10, US/Aleutian, US/Hawaii, Pacific/Marquesas, AST, America/Anchorage, America/Juneau, America/Nome, America/Yakutat, Etc/GMT+9, Pacific/Gambier, SystemV/YST9, SystemV/YST9YDT, US/Alaska, America/Dawson, America/Ensenada, America/Los_Angeles, America/Tijuana, America/Vancouver, America/Whitehorse, Canada/Pacific, Canada/Yukon, Etc/GMT+8, Mexico/BajaNorte, PST, PST8PDT, Pacific/Pitcairn, SystemV/PST8, SystemV/PST8PDT, US/Pacific, US/Pacific-New, America/Boise, America/Cambridge_Bay, America/Chihuahua, America/Dawson_Creek, America/Denver, America/Edmonton, America/Hermosillo, America/Inuvik, America/Mazatlan, America/Phoenix, America/Shiprock, America/Yellowknife, Canada/Mountain, Etc/GMT+7, MST, MST7MDT, Mexico/BajaSur, Navajo, PNT, SystemV/MST7, SystemV/MST7MDT, US/Arizona, US/Mountain, America/Belize, America/Cancun, America/Chicago, America/Costa_Rica, America/El_Salvador, America/Guatemala, America/Indiana/Knox, America/Indiana/Tell_City, America/Knox_IN, America/Managua, America/Menominee, America/Merida, America/Mexico_City, America/Monterrey, America/North_Dakota/Center, America/North_Dakota/New_Salem, America/Rainy_River, America/Rankin_Inlet, America/Regina, America/Swift_Current, America/Tegucigalpa, America/Winnipeg, CST, CST6CDT, Canada/Central, Canada/East-Saskatchewan, Canada/Saskatchewan, Chile/EasterIsland, Etc/GMT+6, Mexico/General, Pacific/Easter, Pacific/Galapagos, SystemV/CST6, SystemV/CST6CDT, US/Central, US/Indiana-Starke, America/Atikokan, America/Bogota, America/Cayman, America/Coral_Harbour, America/Detroit, America/Fort_Wayne, America/Grand_Turk, America/Guayaquil, America/Havana, America/Indiana/Indianapolis, America/Indiana/Marengo, America/Indiana/Petersburg, America/Indiana/Vevay, America/Indiana/Vincennes, America/Indiana/Winamac, America/Indianapolis, America/Iqaluit, America/Jamaica, America/Kentucky/Louisville, America/Kentucky/Monticello, America/Lima, America/Louisville, America/Montreal, America/Nassau, America/New_York, America/Nipigon, America/Panama, America/Pangnirtung, America/Port-au-Prince, America/Resolute, America/Thunder_Bay, America/Toronto, Canada/Eastern, Cuba, EST, EST5EDT, Etc/GMT+5, IET, Jamaica, SystemV/EST5, SystemV/EST5EDT, US/East-Indiana, US/Eastern, US/Michigan, America/Caracas, America/Anguilla, America/Antigua, America/Argentina/San_Luis, America/Aruba, America/Asuncion, America/Barbados, America/Blanc-Sablon, America/Boa_Vista, America/Campo_Grande, America/Cuiaba, America/Curacao, America/Dominica, America/Eirunepe, America/Glace_Bay, America/Goose_Bay, America/Grenada, America/Guadeloupe, America/Guyana, America/Halifax, America/La_Paz, America/Manaus, America/Marigot, America/Martinique, America/Moncton, America/Montserrat, America/Port_of_Spain, America/Porto_Acre, America/Porto_Velho, America/Puerto_Rico, America/Rio_Branco, America/Santiago, America/Santo_Domingo, America/St_Barthelemy, America/St_Kitts, America/St_Lucia, America/St_Thomas, America/St_Vincent, America/Thule, America/Tortola, America/Virgin, Antarctica/Palmer, Atlantic/Bermuda, Atlantic/Stanley, Brazil/Acre, Brazil/West, Canada/Atlantic, Chile/Continental, Etc/GMT+4, PRT, SystemV/AST4, SystemV/AST4ADT, America/St_Johns, CNT, Canada/Newfoundland, AGT, America/Araguaina, America/Argentina/Buenos_Aires, America/Argentina/Catamarca, America/Argentina/ComodRivadavia, America/Argentina/Cordoba, America/Argentina/Jujuy, America/Argentina/La_Rioja, America/Argentina/Mendoza, America/Argentina/Rio_Gallegos, America/Argentina/Salta, America/Argentina/San_Juan, America/Argentina/Tucuman, America/Argentina/Ushuaia, America/Bahia, America/Belem, America/Buenos_Aires, America/Catamarca, America/Cayenne, America/Cordoba, America/Fortaleza, America/Godthab, America/Jujuy, America/Maceio, America/Mendoza, America/Miquelon, America/Montevideo, America/Paramaribo, America/Recife, America/Rosario, America/Santarem, America/Sao_Paulo, Antarctica/Rothera, BET, Brazil/East, Etc/GMT+3, America/Noronha, Atlantic/South_Georgia, Brazil/DeNoronha, Etc/GMT+2, America/Scoresbysund, Atlantic/Azores, Atlantic/Cape_Verde, Etc/GMT+1, Africa/Abidjan, Africa/Accra, Africa/Bamako, Africa/Banjul, Africa/Bissau, Africa/Casablanca, Africa/Conakry, Africa/Dakar, Africa/El_Aaiun, Africa/Freetown, Africa/Lome, Africa/Monrovia, Africa/Nouakchott, Africa/Ouagadougou, Africa/Sao_Tome, Africa/Timbuktu, America/Danmarkshavn, Atlantic/Canary, Atlantic/Faeroe, Atlantic/Faroe, Atlantic/Madeira, Atlantic/Reykjavik, Atlantic/St_Helena, Eire, Etc/GMT, Etc/GMT+0, Etc/GMT-0, Etc/GMT0, Etc/Greenwich, Etc/UCT, Etc/UTC, Etc/Universal, Etc/Zulu, Europe/Belfast, Europe/Dublin, Europe/Guernsey, Europe/Isle_of_Man, Europe/Jersey, Europe/Lisbon, Europe/London, GB, GB-Eire, GMT, GMT0, Greenwich, Iceland, Portugal, UCT, UTC, Universal, WET, Zulu, Africa/Algiers, Africa/Bangui, Africa/Brazzaville, Africa/Ceuta, Africa/Douala, Africa/Kinshasa, Africa/Lagos, Africa/Libreville, Africa/Luanda, Africa/Malabo, Africa/Ndjamena, Africa/Niamey, Africa/Porto-Novo, Africa/Tunis, Africa/Windhoek, Arctic/Longyearbyen, Atlantic/Jan_Mayen, CET, ECT, Etc/GMT-1, Europe/Amsterdam, Europe/Andorra, Europe/Belgrade, Europe/Berlin, Europe/Bratislava, Europe/Brussels, Europe/Budapest, Europe/Copenhagen, Europe/Gibraltar, Europe/Ljubljana, Europe/Luxembourg, Europe/Madrid, Europe/Malta, Europe/Monaco, Europe/Oslo, Europe/Paris, Europe/Podgorica, Europe/Prague, Europe/Rome, Europe/San_Marino, Europe/Sarajevo, Europe/Skopje, Europe/Stockholm, Europe/Tirane, Europe/Vaduz, Europe/Vatican, Europe/Vienna, Europe/Warsaw, Europe/Zagreb, Europe/Zurich, MET, Poland, ART, Africa/Blantyre, Africa/Bujumbura, Africa/Cairo, Africa/Gaborone, Africa/Harare, Africa/Johannesburg, Africa/Kigali, Africa/Lubumbashi, Africa/Lusaka, Africa/Maputo, Africa/Maseru, Africa/Mbabane, Africa/Tripoli, Asia/Amman, Asia/Beirut, Asia/Damascus, Asia/Gaza, Asia/Istanbul, Asia/Jerusalem, Asia/Nicosia, Asia/Tel_Aviv, CAT, EET, Egypt, Etc/GMT-2, Europe/Athens, Europe/Bucharest, Europe/Chisinau, Europe/Helsinki, Europe/Istanbul, Europe/Kaliningrad, Europe/Kiev, Europe/Mariehamn, Europe/Minsk, Europe/Nicosia, Europe/Riga, Europe/Simferopol, Europe/Sofia, Europe/Tallinn, Europe/Tiraspol, Europe/Uzhgorod, Europe/Vilnius, Europe/Zaporozhye, Israel, Libya, Turkey, Africa/Addis_Ababa, Africa/Asmara, Africa/Asmera, Africa/Dar_es_Salaam, Africa/Djibouti, Africa/Kampala, Africa/Khartoum, Africa/Mogadishu, Africa/Nairobi, Antarctica/Syowa, Asia/Aden, Asia/Baghdad, Asia/Bahrain, Asia/Kuwait, Asia/Qatar, Asia/Riyadh, EAT, Etc/GMT-3, Europe/Moscow, Europe/Volgograd, Indian/Antananarivo, Indian/Comoro, Indian/Mayotte, W-SU, Asia/Riyadh87, Asia/Riyadh88, Asia/Riyadh89, Mideast/Riyadh87, Mideast/Riyadh88, Mideast/Riyadh89, Asia/Tehran, Iran, Asia/Baku, Asia/Dubai, Asia/Muscat, Asia/Tbilisi, Asia/Yerevan, Etc/GMT-4, Europe/Samara, Indian/Mahe, Indian/Mauritius, Indian/Reunion, NET, Asia/Kabul, Asia/Aqtau, Asia/Aqtobe, Asia/Ashgabat, Asia/Ashkhabad, Asia/Dushanbe, Asia/Karachi, Asia/Oral, Asia/Samarkand, Asia/Tashkent, Asia/Yekaterinburg, Etc/GMT-5, Indian/Kerguelen, Indian/Maldives, PLT, Asia/Calcutta, Asia/Colombo, Asia/Kolkata, IST, Asia/Kathmandu, Asia/Katmandu, Antarctica/Mawson, Antarctica/Vostok, Asia/Almaty, Asia/Bishkek, Asia/Dacca, Asia/Dhaka, Asia/Novosibirsk, Asia/Omsk, Asia/Qyzylorda, Asia/Thimbu, Asia/Thimphu, BST, Etc/GMT-6, Indian/Chagos, Asia/Rangoon, Indian/Cocos, Antarctica/Davis, Asia/Bangkok, Asia/Ho_Chi_Minh, Asia/Hovd, Asia/Jakarta, Asia/Krasnoyarsk, Asia/Phnom_Penh, Asia/Pontianak, Asia/Saigon, Asia/Vientiane, Etc/GMT-7, Indian/Christmas, VST, Antarctica/Casey, Asia/Brunei, Asia/Choibalsan, Asia/Chongqing, Asia/Chungking, Asia/Harbin, Asia/Hong_Kong, Asia/Irkutsk, Asia/Kashgar, Asia/Kuala_Lumpur, Asia/Kuching, Asia/Macao, Asia/Macau, Asia/Makassar, Asia/Manila, Asia/Shanghai, Asia/Singapore, Asia/Taipei, Asia/Ujung_Pandang, Asia/Ulaanbaatar, Asia/Ulan_Bator, Asia/Urumqi, Australia/Perth, Australia/West, CTT, Etc/GMT-8, Hongkong, PRC, Singapore, Australia/Eucla, Asia/Dili, Asia/Jayapura, Asia/Pyongyang, Asia/Seoul, Asia/Tokyo, Asia/Yakutsk, Etc/GMT-9, JST, Japan, Pacific/Palau, ROK, ACT, Australia/Adelaide, Australia/Broken_Hill, Australia/Darwin, Australia/North, Australia/South, Australia/Yancowinna, AET, Antarctica/DumontDUrville, Asia/Sakhalin, Asia/Vladivostok, Australia/ACT, Australia/Brisbane, Australia/Canberra, Australia/Currie, Australia/Hobart, Australia/Lindeman, Australia/Melbourne, Australia/NSW, Australia/Queensland, Australia/Sydney, Australia/Tasmania, Australia/Victoria, Etc/GMT-10, Pacific/Guam, Pacific/Port_Moresby, Pacific/Saipan, Pacific/Truk, Pacific/Yap, Australia/LHI, Australia/Lord_Howe, Asia/Magadan, Etc/GMT-11, Pacific/Efate, Pacific/Guadalcanal, Pacific/Kosrae, Pacific/Noumea, Pacific/Ponape, SST, Pacific/Norfolk, Antarctica/McMurdo, Antarctica/South_Pole, Asia/Anadyr, Asia/Kamchatka, Etc/GMT-12, Kwajalein, NST, NZ, Pacific/Auckland, Pacific/Fiji, Pacific/Funafuti, Pacific/Kwajalein, Pacific/Majuro, Pacific/Nauru, Pacific/Tarawa, Pacific/Wake, Pacific/Wallis, NZ-CHAT, Pacific/Chatham, Etc/GMT-13, Pacific/Enderbury, Pacific/Tongatapu, Etc/GMT-14, Pacific/Kiritimati]The above Java code is relatively simple and it does the job of providing the valid TimeZone IDs available to me in a given environment, but Groovy can be even simpler to use in situations such as this one. The next code listing is a simple Groovy script for printing out these values. displayTimeZoneIds1.groovyprintln Arrays.toString(TimeZone.availableIDs) Wow! It doesn’t get much simpler than that. Groovy allowed me to drop the class declaration, the main method declaration, both java.util imports, and even simplified the “meaty” line from the Java code. It turns out that it actually does gets even easier, however, as shown in the next version of the Groovy-based script.displayTimeZoneIds2.groovy println TimeZone.availableIDs The second version of the Groovy script dropped use of Arrays.toString(Object) because it is unnecessary when using Groovy arrays. Now that’s super simple: println TimeZone.availableIDsThe static method Arrays.toString(Object[]) was necessary in the Java example to avoid seeing the default Object.toString() implementation for the array of Strings that would look something like this: [Ljava.lang.String;@3e25a5 where the [ indicates an array, the L indicates a reference type (not primitive), java.lang.String is obviously the class name of the elements of the array, and the @3e25a5 represents the “unsigned hexadecimal representation” of the object’s hash code.With things so simple, it seems like it’s a good time to add some additional functionality. We’ll do one more very simple thing that will dramatically improve the readability of our output. The third version of the Groovy script leverages Groovy’s closure support to easy iterate over the String array and print each element of the array (each TimeZone ID) on its own line and without the array delimiting square braces ([]). displayTimeZoneIds3.groovyTimeZone.availableIDs.each {println it} It may seem almost too good to be true, but here’s the output:Etc/GMT+12 Etc/GMT+11MITPacific/Apia Pacific/MidwayPacific/NiuePacific/Pago_Pago Pacific/SamoaUS/SamoaAmerica/Adak America/AtkaEtc/GMT+10HST Pacific/FakaofoPacific/HonoluluPacific/Johnston Pacific/RarotongaPacific/TahitiSystemV/HST10 US/AleutianUS/HawaiiPacific/Marquesas ASTAmerica/AnchorageAmerica/JuneauAmerica/Nome America/YakutatEtc/GMT+9Pacific/GambierSystemV/YST9SystemV/YST9YDTUS/AlaskaAmerica/DawsonAmerica/EnsenadaAmerica/Los_AngelesAmerica/TijuanaAmerica/VancouverAmerica/WhitehorseCanada/PacificCanada/YukonEtc/GMT+8Mexico/BajaNortePSTPST8PDTPacific/PitcairnSystemV/PST8SystemV/PST8PDTUS/PacificUS/Pacific-NewAmerica/BoiseAmerica/Cambridge_BayAmerica/ChihuahuaAmerica/Dawson_CreekAmerica/DenverAmerica/EdmontonAmerica/HermosilloAmerica/InuvikAmerica/MazatlanAmerica/PhoenixAmerica/ShiprockAmerica/YellowknifeCanada/MountainEtc/GMT+7MSTMST7MDTMexico/BajaSurNavajoPNTSystemV/MST7SystemV/MST7MDTUS/ArizonaUS/MountainAmerica/BelizeAmerica/CancunAmerica/ChicagoAmerica/Costa_RicaAmerica/El_SalvadorAmerica/GuatemalaAmerica/Indiana/KnoxAmerica/Indiana/Tell_CityAmerica/Knox_INAmerica/ManaguaAmerica/MenomineeAmerica/MeridaAmerica/Mexico_CityAmerica/MonterreyAmerica/North_Dakota/CenterAmerica/North_Dakota/New_SalemAmerica/Rainy_RiverAmerica/Rankin_InletAmerica/ReginaAmerica/Swift_CurrentAmerica/TegucigalpaAmerica/WinnipegCSTCST6CDTCanada/CentralCanada/East-SaskatchewanCanada/SaskatchewanChile/EasterIslandEtc/GMT+6Mexico/GeneralPacific/EasterPacific/GalapagosSystemV/CST6SystemV/CST6CDTUS/CentralUS/Indiana-StarkeAmerica/AtikokanAmerica/BogotaAmerica/CaymanAmerica/Coral_HarbourAmerica/DetroitAmerica/Fort_WayneAmerica/Grand_TurkAmerica/GuayaquilAmerica/HavanaAmerica/Indiana/IndianapolisAmerica/Indiana/MarengoAmerica/Indiana/PetersburgAmerica/Indiana/VevayAmerica/Indiana/VincennesAmerica/Indiana/WinamacAmerica/IndianapolisAmerica/IqaluitAmerica/JamaicaAmerica/Kentucky/LouisvilleAmerica/Kentucky/MonticelloAmerica/LimaAmerica/LouisvilleAmerica/MontrealAmerica/NassauAmerica/New_YorkAmerica/NipigonAmerica/PanamaAmerica/PangnirtungAmerica/Port-au-PrinceAmerica/ResoluteAmerica/Thunder_BayAmerica/TorontoCanada/EasternCubaESTEST5EDTEtc/GMT+5IETJamaicaSystemV/EST5SystemV/EST5EDTUS/East-IndianaUS/EasternUS/MichiganAmerica/CaracasAmerica/AnguillaAmerica/AntiguaAmerica/Argentina/San_LuisAmerica/ArubaAmerica/AsuncionAmerica/BarbadosAmerica/Blanc-SablonAmerica/Boa_VistaAmerica/Campo_GrandeAmerica/CuiabaAmerica/CuracaoAmerica/DominicaAmerica/EirunepeAmerica/Glace_BayAmerica/Goose_BayAmerica/GrenadaAmerica/GuadeloupeAmerica/GuyanaAmerica/HalifaxAmerica/La_PazAmerica/ManausAmerica/MarigotAmerica/MartiniqueAmerica/MonctonAmerica/MontserratAmerica/Port_of_SpainAmerica/Porto_AcreAmerica/Porto_VelhoAmerica/Puerto_RicoAmerica/Rio_BrancoAmerica/SantiagoAmerica/Santo_DomingoAmerica/St_BarthelemyAmerica/St_KittsAmerica/St_LuciaAmerica/St_ThomasAmerica/St_VincentAmerica/ThuleAmerica/TortolaAmerica/VirginAntarctica/PalmerAtlantic/BermudaAtlantic/StanleyBrazil/AcreBrazil/WestCanada/AtlanticChile/ContinentalEtc/GMT+4PRTSystemV/AST4SystemV/AST4ADTAmerica/St_JohnsCNTCanada/NewfoundlandAGTAmerica/AraguainaAmerica/Argentina/Buenos_AiresAmerica/Argentina/CatamarcaAmerica/Argentina/ComodRivadaviaAmerica/Argentina/CordobaAmerica/Argentina/JujuyAmerica/Argentina/La_RiojaAmerica/Argentina/MendozaAmerica/Argentina/Rio_GallegosAmerica/Argentina/SaltaAmerica/Argentina/San_JuanAmerica/Argentina/TucumanAmerica/Argentina/UshuaiaAmerica/BahiaAmerica/BelemAmerica/Buenos_AiresAmerica/CatamarcaAmerica/CayenneAmerica/CordobaAmerica/FortalezaAmerica/GodthabAmerica/JujuyAmerica/MaceioAmerica/MendozaAmerica/MiquelonAmerica/MontevideoAmerica/ParamariboAmerica/RecifeAmerica/RosarioAmerica/SantaremAmerica/Sao_PauloAntarctica/RotheraBETBrazil/EastEtc/GMT+3America/NoronhaAtlantic/South_GeorgiaBrazil/DeNoronhaEtc/GMT+2America/ScoresbysundAtlantic/AzoresAtlantic/Cape_VerdeEtc/GMT+1Africa/AbidjanAfrica/AccraAfrica/BamakoAfrica/BanjulAfrica/BissauAfrica/CasablancaAfrica/ConakryAfrica/DakarAfrica/El_AaiunAfrica/FreetownAfrica/LomeAfrica/MonroviaAfrica/NouakchottAfrica/OuagadougouAfrica/Sao_TomeAfrica/TimbuktuAmerica/DanmarkshavnAtlantic/CanaryAtlantic/FaeroeAtlantic/FaroeAtlantic/MadeiraAtlantic/ReykjavikAtlantic/St_HelenaEireEtc/GMTEtc/GMT+0Etc/GMT-0Etc/GMT0Etc/GreenwichEtc/UCTEtc/UTCEtc/UniversalEtc/ZuluEurope/BelfastEurope/DublinEurope/GuernseyEurope/Isle_of_ManEurope/JerseyEurope/LisbonEurope/LondonGBGB-EireGMTGMT0GreenwichIcelandPortugalUCTUTCUniversalWETZuluAfrica/AlgiersAfrica/BanguiAfrica/BrazzavilleAfrica/CeutaAfrica/DoualaAfrica/KinshasaAfrica/LagosAfrica/LibrevilleAfrica/LuandaAfrica/MalaboAfrica/NdjamenaAfrica/NiameyAfrica/Porto-NovoAfrica/TunisAfrica/WindhoekArctic/LongyearbyenAtlantic/Jan_MayenCETECTEtc/GMT-1Europe/AmsterdamEurope/AndorraEurope/BelgradeEurope/BerlinEurope/BratislavaEurope/BrusselsEurope/BudapestEurope/CopenhagenEurope/GibraltarEurope/LjubljanaEurope/LuxembourgEurope/MadridEurope/MaltaEurope/MonacoEurope/OsloEurope/ParisEurope/PodgoricaEurope/PragueEurope/RomeEurope/San_MarinoEurope/SarajevoEurope/SkopjeEurope/StockholmEurope/TiraneEurope/VaduzEurope/VaticanEurope/ViennaEurope/WarsawEurope/ZagrebEurope/ZurichMETPolandARTAfrica/BlantyreAfrica/BujumburaAfrica/CairoAfrica/GaboroneAfrica/HarareAfrica/JohannesburgAfrica/KigaliAfrica/LubumbashiAfrica/LusakaAfrica/MaputoAfrica/MaseruAfrica/MbabaneAfrica/TripoliAsia/AmmanAsia/BeirutAsia/DamascusAsia/GazaAsia/IstanbulAsia/JerusalemAsia/NicosiaAsia/Tel_AvivCATEETEgyptEtc/GMT-2Europe/AthensEurope/BucharestEurope/ChisinauEurope/HelsinkiEurope/IstanbulEurope/KaliningradEurope/KievEurope/MariehamnEurope/MinskEurope/NicosiaEurope/RigaEurope/SimferopolEurope/SofiaEurope/TallinnEurope/TiraspolEurope/UzhgorodEurope/VilniusEurope/ZaporozhyeIsraelLibyaTurkeyAfrica/Addis_AbabaAfrica/AsmaraAfrica/AsmeraAfrica/Dar_es_SalaamAfrica/DjiboutiAfrica/KampalaAfrica/KhartoumAfrica/MogadishuAfrica/NairobiAntarctica/SyowaAsia/AdenAsia/BaghdadAsia/BahrainAsia/KuwaitAsia/QatarAsia/RiyadhEATEtc/GMT-3Europe/MoscowEurope/VolgogradIndian/AntananarivoIndian/ComoroIndian/MayotteW-SUAsia/Riyadh87Asia/Riyadh88Asia/Riyadh89Mideast/Riyadh87Mideast/Riyadh88Mideast/Riyadh89Asia/TehranIranAsia/BakuAsia/DubaiAsia/MuscatAsia/TbilisiAsia/YerevanEtc/GMT-4Europe/SamaraIndian/MaheIndian/MauritiusIndian/ReunionNETAsia/KabulAsia/AqtauAsia/AqtobeAsia/AshgabatAsia/AshkhabadAsia/DushanbeAsia/KarachiAsia/OralAsia/SamarkandAsia/TashkentAsia/YekaterinburgEtc/GMT-5Indian/KerguelenIndian/MaldivesPLTAsia/CalcuttaAsia/ColomboAsia/KolkataISTAsia/KathmanduAsia/KatmanduAntarctica/MawsonAntarctica/VostokAsia/AlmatyAsia/BishkekAsia/DaccaAsia/DhakaAsia/NovosibirskAsia/OmskAsia/QyzylordaAsia/ThimbuAsia/ThimphuBSTEtc/GMT-6Indian/ChagosAsia/RangoonIndian/CocosAntarctica/DavisAsia/BangkokAsia/Ho_Chi_MinhAsia/HovdAsia/JakartaAsia/KrasnoyarskAsia/Phnom_PenhAsia/PontianakAsia/SaigonAsia/VientianeEtc/GMT-7Indian/ChristmasVSTAntarctica/CaseyAsia/BruneiAsia/ChoibalsanAsia/ChongqingAsia/ChungkingAsia/HarbinAsia/Hong_KongAsia/IrkutskAsia/KashgarAsia/Kuala_LumpurAsia/KuchingAsia/MacaoAsia/MacauAsia/MakassarAsia/ManilaAsia/ShanghaiAsia/SingaporeAsia/TaipeiAsia/Ujung_PandangAsia/UlaanbaatarAsia/Ulan_BatorAsia/UrumqiAustralia/PerthAustralia/WestCTTEtc/GMT-8HongkongPRCSingaporeAustralia/EuclaAsia/DiliAsia/JayapuraAsia/PyongyangAsia/SeoulAsia/TokyoAsia/YakutskEtc/GMT-9JSTJapanPacific/PalauROKACTAustralia/AdelaideAustralia/Broken_HillAustralia/DarwinAustralia/NorthAustralia/SouthAustralia/YancowinnaAETAntarctica/DumontDUrvilleAsia/SakhalinAsia/VladivostokAustralia/ACTAustralia/BrisbaneAustralia/CanberraAustralia/CurrieAustralia/HobartAustralia/LindemanAustralia/MelbourneAustralia/NSWAustralia/QueenslandAustralia/SydneyAustralia/TasmaniaAustralia/VictoriaEtc/GMT-10Pacific/GuamPacific/Port_MoresbyPacific/SaipanPacific/TrukPacific/YapAustralia/LHIAustralia/Lord_HoweAsia/MagadanEtc/GMT-11Pacific/EfatePacific/GuadalcanalPacific/KosraePacific/NoumeaPacific/PonapeSSTPacific/NorfolkAntarctica/McMurdoAntarctica/South_PoleAsia/AnadyrAsia/KamchatkaEtc/GMT-12KwajaleinNSTNZPacific/AucklandPacific/FijiPacific/FunafutiPacific/KwajaleinPacific/MajuroPacific/NauruPacific/TarawaPacific/WakePacific/WallisNZ-CHATPacific/ChathamEtc/GMT-13Pacific/EnderburyPacific/TongatapuEtc/GMT-14Pacific/KiritimatiBefore finishing this example, I would like to do one more thing to make the returned set of TimeZone IDs easier to manage. It can be difficult to find what I’m looking for in this list and I’d rather see it in sorted form.displayTimeZoneIds4.groovyTimeZone.availableIDs.sort().each {println it} That’s all there is to it — there’s nothing sordid about that. I don’t show it here, but running that single line script will return the available TimeZone IDs without the array syntax, with each ID on its own line, in an alphabetically sorted order.ConclusionThis blog post had two primary purposes. One purpose was to demonstrate another practical example of where Groovy can greatly simplify use of basic Java APIs, especially when simply trying to learn about something new or get a listing of options available in a given environment. A second purpose was to demonstrate how to find out which TimeZone IDs are available, though this was really more of an excuse to demonstrate the sleekness of Groovy. Software Development