Groovier Java TimeZone ID Handling

how-to
Feb 24, 201014 mins

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.groovy

println 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.availableIDs

The 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.groovy

TimeZone.availableIDs.each {println it}

It may seem almost too good to be true, but here’s the output:

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

Before 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.groovy

TimeZone.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.

Conclusion

This 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.