Advanced   Java   Services ZoneId, ZoneOffset, ZoneRules



ZoneId

Die Klasse ZoneId kapselt den Namen einer Zeitzone, etwa "Europe/Berlin" oder "Australia/Queensland" oder "Asia/Jakarta". Eine Zeitzone kann verschiedene Offsets zu GMT haben je nach Jahreszeit (Sommer- Winterzeit, englisch DST = Daylight saving time). Mit der abstrakten Klasse ZoneId kann man über Factorymethoden Instanzen erzeugen. ZoneId hat die reale Klasse ZoneOffset als Kindklasse.


Factorymethoden 1 [systemDefault(), of(), ofOffset()]

Mit den of-Methoden ist es einfach Instanzen von ZoneId zu erzeugen. Gebraucht werden sie u.a. im Zusammenhang mit ZoneOffset, ZoneRules, ZonedDateTime und OffsetDateTime

ZoneId system = ZoneId.systemDefault();
System.out.println(system);  // Europe/Berlin

ZoneId newYork = ZoneId.of("America/New_York");
System.out.println(newYork);  // America/New_York

ZoneId java = ZoneId.of("Asia/Jakarta");
System.out.println(java);  // Asia/Jakarta

ZoneOffset offset = ZoneOffset.ofHours(3);
String prefix = "GMT";  // Greenwich Mean Time
ZoneId gmt = ZoneId.ofOffset(prefix, offset);
System.out.println(gmt);  // GMT+03::00

ZoneOffset offset2 = ZoneOffset.ofHours(3);
String prefix2 = "UTC";  // Universal Time Coordinated
ZoneId utc = ZoneId.ofOffset(prefix2, offset2);
System.out.println(utc);  // UTC+03::00

Factorymethoden 2 [from()]

Für die from()-Methode braucht man eine Instanz vom Typ TemporalAccessor. Kandidaten dafür sind alle Date/Time-Klassen. Nicht jede kann jedoch verwendet werden. Enthält die Instanz keine entsprechende Information reagiert der Compiler mit einer DateTimeException. Das folgende Codeschnipsel zeigt dies. Instant und LocalDateTime enthalten keine Zoneninformation.

LocalDateTime ldt = LocalDateTime.now();
System.out.println("local time        : " + ldt);
//ZoneId id = ZoneId.from(ldt);
// java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: 2014-10-25T10:45:12.171 of type java.time.LocalDateTime

ZoneId jakarta = ZoneId.of("Asia/Jakarta");
LocalDateTime java = LocalDateTime.now(jakarta);
System.out.println("java  time        : " + java);
//ZoneId id2 = ZoneId.from(java);
//java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: 2014-10-25T10:45:12.171 of type java.time.LocalDateTime
System.out.println("-----------------------------------------");

Instant ins = Instant.now();
//ZoneId id2 = ZoneId.from(ins);
//java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: 2014-10-25T08:53:06.240Z of type java.time.Instant

ZonedDateTime zdt = ZonedDateTime.now();
System.out.println("local zoned time  : " + zdt);
ZoneId id1 = ZoneId.from(zdt);
System.out.println("ZoneId: " + id1);

ZonedDateTime zdt2 = ZonedDateTime.now(jakarta);
System.out.println("java zoned time   : " + zdt2);
ZoneId id2 = ZoneId.from(zdt2);
System.out.println("ZoneId: " + id2);
System.out.println("-----------------------------------------");

OffsetDateTime odt = OffsetDateTime.now();
System.out.println("local offset time : " + odt);
ZoneId id3 = ZoneId.from(odt);
System.out.println("ZoneId: " + id3);

OffsetDateTime odt2 = OffsetDateTime.now(jakarta);
System.out.println("java  offset time : " + odt2);
ZoneId id4 = ZoneId.from(odt2);
System.out.println("ZoneId: " + id4);

Ausgabe

local time        : 2014-10-25T11:32:46.197
java  time        : 2014-10-25T16:32:46.212
-----------------------------------------
local zoned time  : 2014-10-25T11:32:46.212+02:00[Europe/Berlin]
ZoneId: Europe/Berlin
java zoned time   : 2014-10-25T16:32:46.228+07:00[Asia/Jakarta]
ZoneId: Asia/Jakarta
-----------------------------------------
local offset time : 2014-10-25T11:32:46.228+02:00
ZoneId: +02:00
java  offset time : 2014-10-25T16:32:46.228+07:00
ZoneId: +07:00

ZoneOffset

ZoneOffset ist eine Unterklasse von ZoneId und kapselt einen Offset zu GMT (UTC) in der Form "+3:00" oder "-4:00"


of()-Methoden

Die of()-Methode wirft eine DateTimeException wenn das Format nicht stimmt.

ZoneOffset zo = ZoneOffset.ofHours(5);
System.out.println(zo);  // +5:00
System.out.println(zo.getTotalSeconds()); // 0
System.out.println("-----------------------------------------");

ZoneOffset zo2= ZoneOffset.of("-02:30:00");
System.out.println(zo2);  // -2:30
System.out.println(zo2.getTotalSeconds()); // 0
System.out.println("-----------------------------------------");

//ZoneOffset zo2a= ZoneOffset.of("-2:30:00");
// java.time.DateTimeException: Invalid ID for ZoneOffset, invalid format: -2:30:00

//ZoneOffset zo2a= ZoneOffset.of("02:30:00");
// java.time.DateTimeException: Invalid ID for ZoneOffset, invalid format: 02:30:00

//ZoneOffset zo3= ZoneOffset.of("+01:60");
// java.time.DateTimeException: Zone offset minutes not in valid range: abs(value) 60 is not in the range 0 to 59

ZoneOffset zo3= ZoneOffset.of("Z");
System.out.println(zo3);  // Z
System.out.println(zo3.getTotalSeconds()); // 0

Ausgabe

+05:00
18000
-----------------------------------------
-02:30
-9000
-----------------------------------------
Z
0

from(TemporalAccessor temporal)

Für die from()-Methode braucht man eine Instanz vom Typ TemporalAccessor. Kandidaten dafür sind alle Date/Time-Klassen. Nicht jede kann jedoch verwendet werden. Enthält die Instanz keine entsprechende Information reagiert der Compiler mit einer DateTimeException.

ZoneId jakarta = ZoneId.of("Asia/Jakarta");
ZonedDateTime zdt = ZonedDateTime.now(jakarta);
ZoneOffset zo = ZoneOffset.from(zdt);
System.out.println(zo);  // +7:00
// Verschiebung zu GMT, nicht zur Systemzone
System.out.println(zdt.getZone());

ZoneId newyork = ZoneId.of("America/New_York");
ZonedDateTime zdt2 = ZonedDateTime.now(newyork);
ZoneOffset zo2 = ZoneOffset.from(zdt2);
System.out.println(zo2);  // -4:00
// Verschiebung zu GMT, nicht zur Systemzone
System.out.println(zdt2.getZone());

ZoneRules

Die Klasse ZoneRules enthält die Regeln, wie sich und ob sich der Offset innerhalb einer Zeitzone ändert (Sommerzeit, Winterzeit). Eine ZoneRule wird aus einer ZoneId oder einem ZoneOffset oder aus einer Date/Time-Klasse gewonnen. Enthält die erzeugende Instanz allerdings keine derartigen Regeln, so enthält die ZoneRule nur den Offset als einzige Regel.


ZoneRule aus ZoneId

// ZoneId -> ZoneRule
ZoneId localZoneId = ZoneId.systemDefault();
System.out.println(localZoneId); // Europe/Berlin
ZoneRules localRules = localZoneId.getRules();
System.out.println("local rules = " + localRules);
ZoneOffset zo = localRules.getOffset(Instant.now());
System.out.println("curr offset = " + zo );
ZoneOffset zostandard = localRules.getStandardOffset(Instant.now());
System.out.println("standard    = " + zostandard );  // Winterzeit ist Standard

Ausgabe

Europe/Berlin
local rules = ZoneRules[currentStandardOffset=+01:00]
curr offset = +02:00
standard    = +01:00

ZoneRule aus ZoneOffset

Ein ZoneOffset enthält keine Information über die ZoneId

// ZoneOffset -> ZoneRule
// statische of(ZoneOffset offset)
System.out.println("no zone id");
ZoneOffset zo2 = ZoneOffset.ofHours(5);
ZoneRules rules = ZoneRules.of(zo2);
System.out.println("rules  = " + rules);
System.out.println("offset = " + zo2 );
System.out.println("--------------------------------------");

Ausgabe

no zone id
rules  = ZoneRules[currentStandardOffset=+05:00]
offset = +05:00

ZoneRule mit statischer of(ZoneOffset offset)-methode

Da im vorliegenden Fall der ZoneOffset aus ZonedDateTime gebildet wird enthalten die ZoneRules die Zoneninformation von "America/New_York".

ZoneId newyork = ZoneId.of("America/New_York");
System.out.println(newyork); // America/New_York
ZonedDateTime zdt2 = ZonedDateTime.now(newyork);
ZoneOffset zo3 = ZoneOffset.from(zdt2);
ZoneRules rules2 = ZoneRules.of(zo3);
System.out.println("new york rules  = " + rules2);
System.out.println("new york offset = " + zo3);

Ausgabe

America/New_York
new york rules  = ZoneRules[currentStandardOffset=-04:00]
new york offset = -04:00

Transitionrules

Aus den ZoneRules bekommt man die Transitionrules, also die Regeln wann in welcher Zeitzone die Sommerzeit auf die Winterzeit wechselt, wenn es in dieser Zeitzone einen solchen Wechsel gibt. Hier fünf Beispiele dazu.


Europe/Berlin
ZoneId localZoneId = ZoneId.systemDefault();
System.out.println(localZoneId); // Europe/Berlin
ZoneRules localRules = localZoneId.getRules();
System.out.println("offset = " + localRules.getOffset(Instant.now()) );
List zotrList = localRules.getTransitionRules();
System.out.println(zotrList.size());  // 2
System.out.println(zotrList);
// TransitionRule[Gap +01:00 to +02:00, SUNDAY on or after MARCH 25 at 01:00 UTC, standard offset +01:00]
// TransitionRule[Overlap +02:00 to +01:00, SUNDAY on or after OCTOBER 25 at 01:00 UTC, standard offset +01:00]

Ausgabe

Europe/Berlin
offset = +02:00
2
TransitionRule[Gap +01:00 to +02:00, SUNDAY on or after MARCH 25 at 01:00 UTC, standard offset +01:00]
TransitionRule[Overlap +02:00 to +01:00, SUNDAY on or after OCTOBER 25 at 01:00 UTC, standard offset +01:00]

Asia/Jakarta
ZoneId java = ZoneId.of("Asia/Jakarta");
System.out.println(java); //
ZoneRules javaRules = java.getRules();
System.out.println("offset = " + javaRules.getOffset(Instant.now()) );
List zotrList2 = javaRules.getTransitionRules();
System.out.println(zotrList2.size());  // 2
System.out.println(zotrList2);
System.out.println("------------------------------------------------");
// 0 [] bedeutet: immer der gleiche Offset zu UTC während des gazen Jahres

Ausgabe

Asia/Jakarta
offset = +07:00
0
[]

America/Los_Angeles
ZoneId angel = ZoneId.of("America/Los_Angeles");
System.out.println(angel); //
ZoneRules angelRules = angel.getRules();
System.out.println("offset = " + angelRules.getOffset(Instant.now()) );
List zotrList3 = angelRules.getTransitionRules();
System.out.println(zotrList3.size());  // 2
System.out.println(zotrList3);
// TransitionRule[Gap -08:00 to -07:00, SUNDAY on or after MARCH 8 at 02:00 WALL, standard offset -08:00],
// TransitionRule[Overlap -07:00 to -08:00, SUNDAY on or after NOVEMBER 1 at 02:00 WALL, standard offset -08:00]
// Assuming I have a UTC time and a TimeZone ID, how do I calculate wall time
//(= UTC time + Timezone offset + daylight savings) in Java knowing that daylight savings change during the year?
// WALL = UTC + ZoneOffset + DST

Ausgabe

America/Los_Angeles
offset = -07:00
2
TransitionRule[Gap -08:00 to -07:00, SUNDAY on or after MARCH 8 at 02:00 WALL, standard offset -08:00]
TransitionRule[Overlap -07:00 to -08:00, SUNDAY on or after NOVEMBER 1 at 02:00 WALL, standard offset -08:00]

Australia/Sydney
ZoneId sydney = ZoneId.of("Australia/Sydney");
System.out.println(sydney); //
ZoneRules sydneyRules = sydney.getRules();
System.out.println("offset = " + sydneyRules.getOffset(Instant.now()) );
List zotrList4 = sydneyRules.getTransitionRules();
System.out.println(zotrList4.size());  // 2
System.out.println(zotrList4);
// TransitionRule[Overlap +11:00 to +10:00, SUNDAY on or after APRIL 1 at 02:00 STANDARD, standard offset +10:00],
// TransitionRule[Gap +10:00 to +11:00, SUNDAY on or after OCTOBER 1 at 02:00 STANDARD, standard offset +10:00]
// STANDARD = UTC + 10
// http://www.timeanddate.com/library/abbreviations/timezones/au/est.html
// Brisbane is on AEST all of year 2014

Ausgabe

Australia/Sydney
offset = +11:00
2
TransitionRule[Overlap +11:00 to +10:00, SUNDAY on or after APRIL 1 at 02:00 STANDARD, standard offset +10:00]
TransitionRule[Gap +10:00 to +11:00, SUNDAY on or after OCTOBER 1 at 02:00 STANDARD, standard offset +10:00]

Australia/Brisbane
ZoneId brisbane = ZoneId.of("Australia/Brisbane");
System.out.println(brisbane); //
ZoneRules brisbaneRules = brisbane.getRules();
System.out.println("offset = " + brisbaneRules.getOffset(Instant.now()) );
List zotrList5 = brisbaneRules.getTransitionRules();
System.out.println(zotrList5.size());  // 2
System.out.println(zotrList5);
// TransitionRule[Overlap +11:00 to +10:00, SUNDAY on or after APRIL 1 at 02:00 STANDARD, standard offset +10:00],
// TransitionRule[Gap +10:00 to +11:00, SUNDAY on or after OCTOBER 1 at 02:00 STANDARD, standard offset +10:00]
// STANDARD = UTC + 10
// http://www.timeanddate.com/library/abbreviations/timezones/au/est.html
// Brisbane is on AEST all of year 2014
// 0 [] bedeutet: immer der gleiche Offset zu UTC während des gazen Jahres

Ausgabe

Australia/Brisbane
offset = +10:00
0
[]

Offset zu einer Zeitzone

Die folgende kleine Methode ermittelt den Offset zu einer gegebenen Zeitzone.

private static ZoneOffset getCurrentOffset(String zoneid)
{
   return ZoneId.of(zoneid).getRules().getOffset(Instant.now());
}

Wegen DST kann der Offset zu einer Zeitzone abhängig vom Datum sein. Hier einige Beispiele.

String martiZone = "America/Martinique";
System.out.println(martiZone);
ZoneOffset martiOffset = getCurrentOffset(martiZone);
System.out.println(martiOffset);

String brisbaneZone = "Australia/Brisbane";
System.out.println(brisbaneZone);
ZoneOffset brisbaneOffset = getCurrentOffset("Australia/Brisbane");
System.out.println(brisbaneOffset);

String southpoleZone = "Antarctica/South_Pole";
System.out.println(southpoleZone);
ZoneOffset southpoleOffset = getCurrentOffset(southpoleZone);
System.out.println(southpoleOffset);

Ausgabe

America/Martinique
-04:00
Australia/Brisbane
+10:00
Antarctica/South_Pole
+13:00

Differenz zweier Zeitzonen zum aktuellen Datum

Die folgende Methode berechnet die Differenz zweieer Zeitzonen.

private static int differenz_zweier_zeitzonen(String zone1, String zone2)
{
   ZoneId id1 = ZoneId.of(zone1);
   ZoneId id2 = ZoneId.of(zone2);

   return (id1.getRules().getOffset(Instant.now()).getTotalSeconds()
         - id2.getRules().getOffset(Instant.now()).getTotalSeconds())/3600;
}

Ein Beispiel

String zone1 = "Europe/Berlin";
String zone2 = "America/New_York";

System.out.print("Zeitdifferenz zwischen " + zone1 + " und " + zone2 + ": ");
int diff = differenz_zweier_zeitzonen(zone2, zone1);
System.out.println(diff + " Stunden");

Ausgabe

Zeitdifferenz zwischen Europe/Berlin und America/New_York: -6 Stunden

Alle Zeitzonen zu einem bestimmten Offset

Die folgende kleine Methode liefert alle Zeitzonen zu einem vorgegebenen Offset und zum aktuellen Datum.

private static Set zonen_zum_offset(int offHours)
{
   Set ids = ZoneId.getAvailableZoneIds();
   TreeSet zones = new TreeSet<>();
   for(String id: ids)
   {
      ZoneOffset zo = ZoneId.of(id).getRules().getOffset(Instant.now());
      if (zo.getTotalSeconds() == offHours*3600)
      {
         zones.add(id);
      }

   }
   return zones;
}

Einige Ergebnisse (Europe/Berlin October 2014 vor der Umstellung auf Winterzeit)

Offset +2
Africa/Blantyre
Africa/Bujumbura
Africa/Cairo
Africa/Ceuta
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Kigali
Africa/Lubumbashi
Africa/Lusaka
Africa/Maputo
Africa/Maseru
Africa/Mbabane
Africa/Tripoli
Africa/Windhoek
Antarctica/Troll
Arctic/Longyearbyen
Asia/Gaza
Asia/Hebron
Atlantic/Jan_Mayen
CET
Egypt
Etc/GMT-2
Europe/Amsterdam
Europe/Andorra
Europe/Belgrade
Europe/Berlin
Europe/Bratislava
Europe/Brussels
Europe/Budapest
Europe/Busingen
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
Libya
MET
Poland
Offset +7
Antarctica/Davis
Asia/Bangkok
Asia/Ho_Chi_Minh
Asia/Hovd
Asia/Jakarta
Asia/Novokuznetsk
Asia/Novosibirsk
Asia/Omsk
Asia/Phnom_Penh
Asia/Pontianak
Asia/Saigon
Asia/Vientiane
Etc/GMT-7
Indian/Christmas










Alle Zeitzonen

Alle Zeitzonen bekommt man sortiert mit der nachfolgenden einfachen Methode.

private static void alleZoneIds()
{
   Set<String> zoneIds = ZoneId.getAvailableZoneIds();
   TreeSet<String> ts = new TreeSet<String>(zoneIds);
   for(String zone: ts)
      System.out.println(zone);

}

Die Tabelle wird nach und nach vervollständigt.

Zeitzonen
Africa
  Africa/Abidjan [+00:00]   Africa/Accra [+00:00]   Africa/Addis_Ababa [+03:00]   Africa/Algiers [+01:00]   Africa/Asmara [+03:00]   Africa/Asmera [+03:00]   Africa/Bamako [+00:00]   Africa/Bangui [+01:00]   Africa/Banjul [+00:00]   Africa/Bissau [+00:00]   Africa/Blantyre [+02:00]   Africa/Brazzaville [+01:00]   Africa/Bujumbura [+02:00]   Africa/Cairo [+02:00]   Africa/Casablanca [+00:00]   Africa/Ceuta [+02:00] [+01:00]   Africa/Conakry [+00:00]   Africa/Dakar [+00:00]   Africa/Dar_es_Salaam [+03:00]   Africa/Djibouti [+03:00]   Africa/Douala [+01:00]   Africa/El_Aaiun [+00:00]   Africa/Freetown [+00:00]   Africa/Gaborone [+02:00]   Africa/Harare [+02:00]   Africa/Johannesburg [+02:00]   Africa/Juba [+03:00]   Africa/Kampala [+03:00]   Africa/Khartoum [+03:00]   Africa/Kigali [+02:00]   Africa/Kinshasa [+01:00]   Africa/Lagos [+01:00]   Africa/Libreville [+01:00]   Africa/Lome [+00:00]   Africa/Luanda [+01:00]   Africa/Lubumbashi [+02:00]   Africa/Lusaka [+02:00]   Africa/Malabo [+01:00]   Africa/Maputo [+02:00]   Africa/Maseru [+02:00]   Africa/Mbabane [+02:00]   Africa/Mogadishu [+03:00]   Africa/Monrovia [+00:00]   Africa/Nairobi [+03:00]   Africa/Ndjamena [+01:00]   Africa/Niamey [+01:00]   Africa/Nouakchott [+00:00]   Africa/Ouagadougou [+00:00]   Africa/Porto-Novo [+01:00]   Africa/Sao_Tome [+00:00]   Africa/Timbuktu [+00:00]   Africa/Tripoli [+02:00]   Africa/Tunis [+01:00]   Africa/Windhoek [+01:00] [+02:00]
America
  America/Adak [-09:00] [-10:00]   America/Anchorage [-08:00] [-09:00]   America/Anguilla [-04:00]   America/Antigua [-04:00]   America/Araguaina [-03:00]   America/Argentina/Buenos_Aires [-03:00]   America/Argentina/Catamarca [-03:00]   America/Argentina/ComodRivadavia [-03:00]   America/Argentina/Cordoba [-03:00]   America/Argentina/Jujuy [-03:00]   America/Argentina/La_Rioja [-03:00]   America/Argentina/Mendoza [-03:00]   America/Argentina/Rio_Gallegos [-03:00]   America/Argentina/Salta [-03:00]   America/Argentina/San_Juan [-03:00]   America/Argentina/San_Luis [-03:00]   America/Argentina/Tucuman [-03:00]   America/Argentina/Ushuaia [-03:00]   America/Aruba [-04:00]   America/Asuncion [-04:00] [-03:00]   America/Atikokan [-05:00]   America/Atka [-09:00] [-10:00]   America/Bahia [-03:00]   America/Bahia_Banderas [-05:00] [-06:00]   America/Barbados [-04:00]   America/Belem [-03:00]   America/Belize [-06:00]   America/Blanc-Sablon [-04:00]   America/Boa_Vista [-04:00]   America/Bogota [-05:00]   America/Boise [-06:00] [-07:00]   America/Buenos_Aires [-03:00]   America/Cambridge_Bay [-06:00] [-07:00]   America/Campo_Grande [-04:00] [-03:00]   America/Cancun [-05:00]   America/Caracas [-04:00]   America/Catamarca [-03:00]   America/Cayenne [-03:00]   America/Cayman [-05:00]   America/Chicago [-05:00] [-06:00]   America/Chihuahua [-06:00] [-07:00]   America/Coral_Harbour [-05:00]   America/Cordoba [-03:00]   America/Costa_Rica [-06:00]   America/Creston [-07:00]   America/Cuiaba [-04:00] [-03:00]   America/Curacao [-04:00]   America/Danmarkshavn [+00:00]   America/Dawson [-07:00] [-08:00]   America/Dawson_Creek [-07:00]   America/Denver [-06:00] [-07:00]   America/Detroit [-04:00] [-05:00]   America/Dominica [-04:00]   America/Edmonton [-06:00] [-07:00]   America/Eirunepe [-05:00]   America/El_Salvador [-06:00]   America/Ensenada [-07:00] [-08:00]   America/Fort_Nelson [-07:00]   America/Fort_Wayne [-04:00] [-05:00]   America/Fortaleza [-03:00]   America/Glace_Bay [-03:00] [-04:00]   America/Godthab [-02:00] [-03:00]   America/Goose_Bay [-03:00] [-04:00]   America/Grand_Turk [-04:00]   America/Grenada [-04:00]   America/Guadeloupe [-04:00]   America/Guatemala [-06:00]   America/Guayaquil [-05:00]   America/Guyana [-04:00]   America/Halifax [-03:00] [-04:00]   America/Havana [-04:00] [-05:00]   America/Hermosillo [-07:00]   America/Indiana/Indianapolis [-04:00] [-05:00]   America/Indiana/Knox [-05:00] [-06:00]   America/Indiana/Marengo [-04:00] [-05:00]   America/Indiana/Petersburg [-04:00] [-05:00]   America/Indiana/Tell_City [-05:00] [-06:00]   America/Indiana/Vevay [-04:00] [-05:00]   America/Indiana/Vincennes [-04:00] [-05:00]   America/Indiana/Winamac [-04:00] [-05:00]   America/Indianapolis [-04:00] [-05:00]   America/Inuvik [-06:00] [-07:00]   America/Iqaluit [-04:00] [-05:00]   America/Jamaica [-05:00]   America/Jujuy [-03:00]   America/Juneau [-08:00] [-09:00]   America/Kentucky/Louisville [-04:00] [-05:00]   America/Kentucky/Monticello [-04:00] [-05:00]   America/Knox_IN [-05:00] [-06:00]   America/Kralendijk [-04:00]   America/La_Paz [-04:00]   America/Lima [-05:00]   America/Los_Angeles [-07:00] [-08:00]   America/Louisville [-04:00] [-05:00]   America/Lower_Princes [-04:00]   America/Maceio [-03:00]   America/Managua [-06:00]   America/Manaus [-04:00]   America/Marigot [-04:00]   America/Martinique [-04:00]   America/Matamoros [-05:00] [-06:00]   America/Mazatlan [-06:00] [-07:00]   America/Mendoza [-03:00]   America/Menominee [-05:00] [-06:00]   America/Merida [-05:00] [-06:00]   America/Metlakatla [-08:00] [-09:00]   America/Mexico_City [-05:00] [-06:00]   America/Miquelon [-02:00] [-03:00]   America/Moncton [-03:00] [-04:00]   America/Monterrey [-05:00] [-06:00]   America/Montevideo [-03:00]   America/Montreal [-04:00] [-05:00]   America/Montserrat [-04:00]   America/Nassau [-04:00] [-05:00]   America/New_York [-04:00] [-05:00]   America/Nipigon [-04:00] [-05:00]   America/Nome [-08:00] [-09:00]   America/Noronha [-02:00]   America/North_Dakota/Beulah [-05:00] [-06:00]   America/North_Dakota/Center [-05:00] [-06:00]   America/North_Dakota/New_Salem [-05:00] [-06:00]   America/Ojinaga [-06:00] [-07:00]   America/Panama [-05:00]   America/Pangnirtung [-04:00] [-05:00]   America/Paramaribo [-03:00]   America/Phoenix [-07:00]   America/Port-au-Prince [-05:00]   America/Port_of_Spain [-04:00]   America/Porto_Acre [-05:00]   America/Porto_Velho [-04:00]   America/Puerto_Rico [-04:00]   America/Rainy_River [-05:00] [-06:00]   America/Rankin_Inlet [-05:00] [-06:00]   America/Recife [-03:00]   America/Regina [-06:00]   America/Resolute [-05:00] [-06:00]   America/Rio_Branco [-05:00]   America/Rosario [-03:00]   America/Santa_Isabel [-07:00] [-08:00]   America/Santarem [-03:00]   America/Santiago [-04:00] [-03:00]   America/Santo_Domingo [-04:00]   America/Sao_Paulo [-03:00] [-02:00]   America/Scoresbysund [+00:00] [-01:00]   America/Shiprock [-06:00] [-07:00]   America/Sitka [-08:00] [-09:00]   America/St_Barthelemy [-04:00]   America/St_Johns [-02:30] [-03:30]   America/St_Kitts [-04:00]   America/St_Lucia [-04:00]   America/St_Thomas [-04:00]   America/St_Vincent [-04:00]   America/Swift_Current [-06:00]   America/Tegucigalpa [-06:00]   America/Thule [-03:00] [-04:00]   America/Thunder_Bay [-04:00] [-05:00]   America/Tijuana [-07:00] [-08:00]   America/Toronto [-04:00] [-05:00]   America/Tortola [-04:00]   America/Vancouver [-07:00] [-08:00]   America/Virgin [-04:00]   America/Whitehorse [-07:00] [-08:00]   America/Winnipeg [-05:00] [-06:00]   America/Yakutat [-08:00] [-09:00]   America/Yellowknife [-06:00] [-07:00]
Antarctica
  Antarctica/Casey [+08:00]   Antarctica/Davis [+07:00]   Antarctica/DumontDUrville [+10:00]   Antarctica/Macquarie [+11:00]   Antarctica/Mawson [+05:00]   Antarctica/McMurdo [+12:00] [+13:00]   Antarctica/Palmer [-04:00] [-03:00]   Antarctica/Rothera [-03:00]   Antarctica/South_Pole [+12:00] [+13:00]   Antarctica/Syowa [+03:00]   Antarctica/Troll [+02:00] [+00:00]   Antarctica/Vostok [+06:00]
Arctic
  Arctic/Longyearbyen [+02:00] [+01:00]
Asia
  Asia/Aden [+03:00]   Asia/Almaty [+06:00]   Asia/Amman [+03:00] [+02:00]   Asia/Anadyr [+12:00]   Asia/Aqtau [+05:00]   Asia/Aqtobe [+05:00]   Asia/Ashgabat [+05:00]   Asia/Ashkhabad [+05:00]   Asia/Baghdad [+03:00]   Asia/Bahrain [+03:00]   Asia/Baku [+04:00]   Asia/Bangkok [+07:00]   Asia/Barnaul [+07:00]   Asia/Beirut [+03:00] [+02:00]   Asia/Bishkek [+06:00]   Asia/Brunei [+08:00]   Asia/Calcutta [+05:30]   Asia/Chita [+09:00]   Asia/Choibalsan [+09:00] [+08:00]   Asia/Chongqing [+08:00]   Asia/Chungking [+08:00]   Asia/Colombo [+05:30]   Asia/Dacca [+06:00]   Asia/Damascus [+03:00] [+02:00]   Asia/Dhaka [+06:00]   Asia/Dili [+09:00]   Asia/Dubai [+04:00]   Asia/Dushanbe [+05:00]   Asia/Gaza [+03:00] [+02:00]   Asia/Harbin [+08:00]   Asia/Hebron [+03:00] [+02:00]   Asia/Ho_Chi_Minh [+07:00]   Asia/Hong_Kong [+08:00]   Asia/Hovd [+08:00] [+07:00]   Asia/Irkutsk [+08:00]   Asia/Istanbul [+03:00] [+02:00]   Asia/Jakarta [+07:00]   Asia/Jayapura [+09:00]   Asia/Jerusalem [+03:00] [+02:00]   Asia/Kabul [+04:30]   Asia/Kamchatka [+12:00]   Asia/Karachi [+05:00]   Asia/Kashgar [+06:00]   Asia/Kathmandu [+05:45]   Asia/Katmandu [+05:45]   Asia/Khandyga [+09:00]   Asia/Kolkata [+05:30]   Asia/Krasnoyarsk [+07:00]   Asia/Kuala_Lumpur [+08:00]   Asia/Kuching [+08:00]   Asia/Kuwait [+03:00]   Asia/Macao [+08:00]   Asia/Macau [+08:00]   Asia/Magadan [+11:00]   Asia/Makassar [+08:00]   Asia/Manila [+08:00]   Asia/Muscat [+04:00]   Asia/Nicosia [+03:00] [+02:00]   Asia/Novokuznetsk [+07:00]   Asia/Novosibirsk [+06:00]   Asia/Omsk [+06:00]   Asia/Oral [+05:00]   Asia/Phnom_Penh [+07:00]   Asia/Pontianak [+07:00]   Asia/Pyongyang [+08:30]   Asia/Qatar [+03:00]   Asia/Qyzylorda [+06:00]   Asia/Rangoon [+06:30]   Asia/Riyadh [+03:00]   Asia/Saigon [+07:00]   Asia/Sakhalin [+11:00]   Asia/Samarkand [+05:00]   Asia/Seoul [+09:00]   Asia/Shanghai [+08:00]   Asia/Singapore [+08:00]   Asia/Srednekolymsk [+11:00]   Asia/Taipei [+08:00]   Asia/Tashkent [+05:00]   Asia/Tbilisi [+04:00]   Asia/Tehran [+04:30] [+03:30]   Asia/Tel_Aviv [+03:00] [+02:00]   Asia/Thimbu [+06:00]   Asia/Thimphu [+06:00]   Asia/Tokyo [+09:00]   Asia/Tomsk [+07:00]   Asia/Ujung_Pandang [+08:00]   Asia/Ulaanbaatar [+09:00] [+08:00]   Asia/Ulan_Bator [+09:00] [+08:00]   Asia/Urumqi [+06:00]   Asia/Ust-Nera [+10:00]   Asia/Vientiane [+07:00]   Asia/Vladivostok [+10:00]   Asia/Yakutsk [+09:00]   Asia/Yekaterinburg [+05:00]   Asia/Yerevan [+04:00]
Atlantic
  Atlantic/Azores [+00:00] [-01:00]   Atlantic/Bermuda [-03:00] [-04:00]   Atlantic/Canary [+01:00] [+00:00]   Atlantic/Cape_Verde [-01:00]   Atlantic/Faeroe [+01:00] [+00:00]   Atlantic/Faroe [+01:00] [+00:00]   Atlantic/Jan_Mayen [+02:00] [+01:00]   Atlantic/Madeira [+01:00] [+00:00]   Atlantic/Reykjavik [+00:00]   Atlantic/South_Georgia [-02:00]   Atlantic/St_Helena [+00:00]   Atlantic/Stanley [-03:00]
Australia
  Australia/ACT [+10:00] [+11:00]   Australia/Adelaide [+09:30] [+10:30]   Australia/Brisbane [+10:00]   Australia/Broken_Hill [+09:30] [+10:30]   Australia/Canberra [+10:00] [+11:00]   Australia/Currie [+10:00] [+11:00]   Australia/Darwin [+09:30]   Australia/Eucla [+08:45]   Australia/Hobart [+10:00] [+11:00]   Australia/LHI [+10:30] [+11:00]   Australia/Lindeman [+10:00]   Australia/Lord_Howe [+10:30] [+11:00]   Australia/Melbourne [+10:00] [+11:00]   Australia/NSW [+10:00] [+11:00]   Australia/North [+09:30]   Australia/Perth [+08:00]   Australia/Queensland [+10:00]   Australia/South [+09:30] [+10:30]   Australia/Sydney [+10:00] [+11:00]   Australia/Tasmania [+10:00] [+11:00]   Australia/Victoria [+10:00] [+11:00]   Australia/West [+08:00]   Australia/Yancowinna [+09:30] [+10:30]
Brazil
  Brazil/Acre [-05:00]   Brazil/DeNoronha [-02:00]   Brazil/East [-03:00] [-02:00]   Brazil/West [-04:00]
CET
  CET [+02:00] [+01:00]
CST6CDT
  CST6CDT [-05:00] [-06:00]
Canada
  Canada/Atlantic [-03:00] [-04:00]   Canada/Central [-05:00] [-06:00]   Canada/East-Saskatchewan [-06:00]   Canada/Eastern [-04:00] [-05:00]   Canada/Mountain [-06:00] [-07:00]   Canada/Newfoundland [-02:30] [-03:30]   Canada/Pacific [-07:00] [-08:00]   Canada/Saskatchewan [-06:00]   Canada/Yukon [-07:00] [-08:00]
Chile
  Chile/Continental [-04:00] [-03:00]   Chile/EasterIsland [-06:00] [-05:00]
Cuba
  Cuba [-04:00] [-05:00]
EET
  EET [+03:00] [+02:00]
EST5EDT
  EST5EDT [-04:00] [-05:00]
Egypt
  Egypt [+02:00]
Eire
  Eire [+01:00] [+00:00]
Etc
  Etc/GMT [+00:00]   Etc/GMT+0 [+00:00]   Etc/GMT+1 [-01:00]   Etc/GMT+10 [-10:00]   Etc/GMT+11 [-11:00]   Etc/GMT+12 [-12:00]   Etc/GMT+2 [-02:00]   Etc/GMT+3 [-03:00]   Etc/GMT+4 [-04:00]   Etc/GMT+5 [-05:00]   Etc/GMT+6 [-06:00]   Etc/GMT+7 [-07:00]   Etc/GMT+8 [-08:00]   Etc/GMT+9 [-09:00]   Etc/GMT-0 [+00:00]   Etc/GMT-1 [+01:00]   Etc/GMT-10 [+10:00]   Etc/GMT-11 [+11:00]   Etc/GMT-12 [+12:00]   Etc/GMT-13 [+13:00]   Etc/GMT-14 [+14:00]   Etc/GMT-2 [+02:00]   Etc/GMT-3 [+03:00]   Etc/GMT-4 [+04:00]   Etc/GMT-5 [+05:00]   Etc/GMT-6 [+06:00]   Etc/GMT-7 [+07:00]   Etc/GMT-8 [+08:00]   Etc/GMT-9 [+09:00]   Etc/GMT0 [+00:00]   Etc/Greenwich [+00:00]   Etc/UCT [+00:00]   Etc/UTC [+00:00]   Etc/Universal [+00:00]   Etc/Zulu [+00:00]
Europe
Europe/Amsterdam [+02:00]   Europe/Andorra [+02:00]   Europe/Astrakhan [+04:00]   Europe/Athens [+03:00]   Europe/Belfast [+01:00]   Europe/Belgrade [+02:00]   Europe/Berlin [+02:00]   Europe/Bratislava [+02:00]   Europe/Brussels [+02:00]   Europe/Bucharest [+03:00]   Europe/Budapest [+02:00]   Europe/Busingen [+02:00]   Europe/Chisinau [+03:00]   Europe/Copenhagen [+02:00]   Europe/Dublin [+01:00]   Europe/Gibraltar [+02:00]   Europe/Guernsey [+01:00]   Europe/Helsinki [+03:00]   Europe/Isle_of_Man [+01:00]   Europe/Istanbul [+03:00]   Europe/Jersey [+01:00]   Europe/Kaliningrad [+02:00]   Europe/Kiev [+03:00]   Europe/Kirov [+03:00]   Europe/Lisbon [+01:00]   Europe/Ljubljana [+02:00]   Europe/London [+01:00]   Europe/Luxembourg [+02:00]   Europe/Madrid [+02:00]   Europe/Malta [+02:00]   Europe/Mariehamn [+03:00]   Europe/Minsk [+03:00]   Europe/Monaco [+02:00]   Europe/Moscow [+03:00]   Europe/Nicosia [+03:00]   Europe/Oslo [+02:00]   Europe/Paris [+02:00]   Europe/Podgorica [+02:00]   Europe/Prague [+02:00]   Europe/Riga [+03:00]   Europe/Rome [+02:00]   Europe/Samara [+04:00]   Europe/San_Marino [+02:00]   Europe/Sarajevo [+02:00]   Europe/Simferopol [+03:00]   Europe/Skopje [+02:00]   Europe/Sofia [+03:00]   Europe/Stockholm [+02:00]   Europe/Tallinn [+03:00]   Europe/Tirane [+02:00]   Europe/Tiraspol [+03:00]   Europe/Ulyanovsk [+04:00]   Europe/Uzhgorod [+03:00]   Europe/Vaduz [+02:00]   Europe/Vatican [+02:00]   Europe/Vienna [+02:00]   Europe/Vilnius [+03:00]   Europe/Volgograd [+03:00]   Europe/Warsaw [+02:00]   Europe/Zagreb [+02:00]   Europe/Zaporozhye [+03:00]   Europe/Zurich [+02:00]
GB
  GB [+01:00] [+00:00]
GB-Eire
  GB-Eire [+01:00] [+00:00]
GMT
  GMT [+00:00]
GMT0
  GMT0 [+00:00]
Greenwich
  Greenwich [+00:00]
Hongkong
  Hongkong [+08:00]
Iceland
  Iceland [+00:00]
Indian
  Indian/Antananarivo [+03:00]   Indian/Chagos [+06:00]   Indian/Christmas [+07:00]   Indian/Cocos [+06:30]   Indian/Comoro [+03:00]   Indian/Kerguelen [+05:00]   Indian/Mahe [+04:00]   Indian/Maldives [+05:00]   Indian/Mauritius [+04:00]   Indian/Mayotte [+03:00]   Indian/Reunion [+04:00]
xxx
xxx
xxx
xxx
xxx