Dates & Timestamps In Azure Data Factory: Parsing, Formatting, Converting - Pipeline & Data Flow

Date and time information is a vital piece of any dataset, for example, when a purchase was made, when is the last time user logged in, how long a request took. Unsurprisingly, dealing with date and time comes with its own set of challenges when developing pipelines and transformations using Azure Data Factory.

Dates/timestamps often need to be parsed, formatted, compared, or converted between time zones while working with data. As with any platform, Azure Data Factory provides support for working with dates based on its own rules and limitations.

In this post, we will cover details of working with date and time in Azure Data Factory and also present solutions to some common problems you might encounter. All explanations are accompanied with code examples to make things easier to understand.

Contents:

Overview

Azure Data Factory, also known as ADF, is a cloud service that provides capability to perform data integration and data transformation tasks. It integrates with many Azure and third-party services via built-in connectors. There’s no need to write code since everything is managed through UI.

First, we start with a discussion about what is usually meant when people talk about data factory expression language. It might be confusing but ADF pipelines and data flows use different expression languages with different data types and functions.

Second, we zoom in and focus on date and time in the context of Azure Data Factory. This section covers important aspects such as relevant data types, date formats, time zones, and functions that can be used to manipulate dates and timestamps.

Finally, we wrap up the conversation with a number of practical use cases which you might encounter while working with date and time in Azure Data Factory. The list is definitely not exhaustive, but should give a good understanding of how to use these functions in practice.

Expression Languages: Pipeline vs Data Flow

When talking about Azure Data Factory expression language, it is important to understand that there are actually two types of expressions used in ADF: Pipeline and Data Flow expression languages. In this post, I’ll use word syntax as a synonym for expression language.

Pipeline Expression Language

Pipeline expression language, or Data Factory expression language, is used within ADF pipelines. The most common use is to configure different pipeline activities and work with parameters/variables. Examples of activities include Copy, Azure Function, If Condition, and many more.

The documentation about expressions and functions of the pipeline expression language can be found here.

One thing to mention is the available data types, this will be useful in the following sections. Data types that we might encounter in Azure Data Factory pipelines are: String, Int, Float, Bool, Array, Object, SecureString.

NOTE: ADF Pipeline Expression Language requires at sign @ in front of an expression, like @utcNow(), otherwise it will be treated as a plain string. However, in this post’s examples I’ll omit adding @ for each command since it’s not needed if utcNow() is a part of a larger expression.

Data Flow Expression Language

Mapping Data Flows, or simply Data Flows, are data transformations defined through UI interface. The transformations themselves are run on a Apache Spark cluster, however, Azure Data Factory abstracts Spark from us, users, and does cluster management behind the scenes.

We can think of a Data Flow as a special type of activity, which can be triggered as a part of a Data Factory pipeline using Data Flow activity.

In contrast to the pipeline expression language, Data Flow expression language has a richer set of data types. This is due to the fact that Data Flows run on Spark, and Spark runs on JVM, so Data Flow data types are based on Java types.

The full list of data types supported in Mapping Data Flows can be found here.

Dates And Timestamps In Azure Data Factory

This section gives an overview of the data types and functions available to work with dates and timestamps in Pipeline and Data Flow expression languages.

NOTE: As a general rule, it is usually worth keeping dates and timestamps in UTC time zone to avoid unexpected time zone conversions and dependencies on where the processing machine is located.

Pipeline Expression Language

In Azure Data Factory pipelines, dates/timestamps are represented as strings since there’s no dedicated date data type available.

For example, system variable @pipeline().TriggerTime returns a string like 2022-09-30T21:53:00.0000000Z which represents timestamp in UTC time zone.

Date Formats

Time Zones

Some of the date-related functions require a time zone name as a parameter, for example, one example of such function is convertTimeZone.

ADF Pipeline expression language uses Microsoft Time Zone Values for time zone identifiers. Note that you might need to remove punctuation from the name when passing it as a parameter to the functions.

Functions

To enable working with dates represented as strings, Azure Data Factory provides a number of useful functions. Due to the space limitation, we will only look at a few most important functions here:

Data Flow Expression Language

Data Flow expression language contains both Date and Timestamp data types. This is an interesting difference compared to the Pipeline expression language where these types are not present.

Date Formats

Data Flow’s date and time formatting is based on Java’s SimpleDateFormat class.

NOTE: Rules for defining datetime formats in Data Flow expression language are different from Pipeline expression language’s rules, so it is worth studying the link above.

When parsing a string to a date or a timestamp, the system needs to know how the format of the input string value, otherwise it will assume it is in the default format. Please see the short summary about formats for dates and timestamps:

NOTE: All letters [a-zA-Z] are interpreted as part of the pattern unless they are enclosed in quotes. So, the format for the value '2022-09-30T21:19:00' must be 'yyyy-MM-dd\'T\'HH:mm:ss'. Note the \'T\' part of the pattern and that the single quotes are escaped with the backslash.

Time Zones

Data Flow date and timestamp functions rely on Java’s TimeZone class to represent time zone information. Some time zone examples are: UTC, PST, Asia/Singapore, Europe/Vienna.

Unfortunately, I couldn’t find the list of the values in the official documentation, so I retrieved the list of time zones by running TimeZone.getAvailableIDs() in Java 8 and attached the results in the appendix.

Functions

Data Flow expression language provides a lot of functions to work with dates and timestamps. They are ranging from parsing and formatting to adding/removing time duration and extracting a specific part of a date.

The full list of Data Flow’s date and time functions can be found here. In this section, we will cover only the most common ones (in my opinion), more functions will be used in the examples section of this post.

Examples Of Working With Date And Time In Azure Data Factory

This section presents solutions to a number of use cases where dates and timestamps are involved.

Parse String To Timestamp

Task: Given a string representing both date and time, convert it to the corresponding timestamp data type.

Pipeline Expression Language

Since Pipeline expression language doesn’t have a timestamp data type, there is no need to parse a datetime string because at the end it will still end up as a string.

However, we can convert incoming timestamps to a common format, for example, the default one, using formatDateTime function so that it makes working with the timestamps consistent later in the pipeline.

formatDateTime('2022-09-30 21:19:00') // Result: 2022-09-30T21:19:00Z
formatDateTime('09/30/2022 21:19:00', 'yyyy-MM-ddTHH:mm:ss') // Result: 2022-09-30T21:19:00Z

Data Flow Expression Language

We can leverage toTimestamp function to convert a datetime string to the timestamp data type. A few notes about the function:

toTimestamp('2022-09-30 21:19:00')
toTimestamp('09/30/2022 21:19:00', 'MM/dd/yyyy HH:mm:ss')
toTimestamp('09/30/2022 21:19:00', 'MM/dd/yyyy HH:mm:ss', 'PST') /* 2022-10-01 04:19:00.000 */

Parse String To Date

Task: Given a string representing only date part, convert it to the corresponding date data type.

Pipeline Expression Language

As discussed in the section about date and time, dates in the pipeline expression language are represented as strings and there’s no dedicated data type for dates. However, we might still want to at least convert date to a common format, see formats section for details.

formatDateTime('09/30/2022') /* Result: 2022-09-30T00:00:00Z */
formatDateTime('09/30/2022', 'yyyy-MM-dd') /* Result: 2022-09-30 */

Data Flow Expression Language

Data Flows have a Date data type and a corresponding function toDate to convert strings to dates. Note that you might need to specify the format of your date string if it’s not in the default format.

toDate('2022-9-30')
toDate('2022-09-30')
toDate('09/30/2022', 'MM/dd/yyyy')
/* Result: 2022-09-30 */

Convert Date Or Timestamp To String + Custom Formatting

Task: Given a date or a timestamp, convert it to a string representation. Optionally, apply custom formatting if needed.

Pipeline Expression Language

Since dates and timestamps in the pipeline expression language are strings, the only thing we might worry about here is the format. This is where formatDateTime function can help apply the format we want.

There are 2 ways how to specify datetime format: single letter specifier ('D') or a custom format ('yyyy-MM-ddTHH:mm:ss'). Both of them are described in the date formats for pipeline language expression with documentation links included.

formatDateTime('2022-09-30 21:40:47', 'D') // Result: Friday, September 30, 2022
formatDateTime('2022-09-30 21:40:47', 'yyyy-MM-ddTHH:mm:ss.fffffZ') // Result: 2022-09-30T21:40:47Z
formatDateTime('2022-09-30', 'MM/dd/yyyy') // Result: 09/30/2022

Data Flow Expression Language

Both date to string and timestamp to string conversions are handled by toString function. In addition to the date or timestamp, the function also accepts optional parameters:

toString(toTimestamp('2022-09-30 21:40:47'), 'yyyy-MM-dd\'T\'HH:mm:ss.SSS') /* Result: 2022-09-30T21:40:47.000 */
toString(toDate('2022-9-30'), 'yyyy-MM-dd\'T\'HH:mm:ss') /* Result: 2022-09-30T00:00:00 */
toString(toDate('2022-09-30'), 'EEE, MMM d, yyyy', 'fr-FR') /* Result: ven., sept. 30, 2022 */

Get Current Date/Timestamp

Task: Get the current date or timestamp in UTC or local time zone.

Pipeline Expression Language

Current timestamp can be retrieved using utcNow function. Additionally, if we want to have it in a different time zone, then convertFromUtc function can help.

To get the current date, we’ll use the same utcNow function but specify an output format to only keep the date portion of the timestamp.

Read more about date/timestamp formats and time zone names.

utcNow()
utcNow('yyyy-MM-dd HH:mm:ss')
convertFromUtc(utcNow(), 'Eastern Standard Time')

utcNow('yyyy-MM-dd')
convertFromUtc(utcNow(), 'Central Europe Standard Time', 'yyyy-MM-dd')

Data Flow Expression Language

Current timestamp can be obtained using currentUTC and currentTimestamp functions in UTC and local time zone respectively.

Similarly, current date can be retrieved using currentDate function.

Note that currentUTC and currentDate accept a time zone as an optional parameter, and this value will be used instead of the local machine’s time zone which is the default value. It should behave as if the executing code is run in that the time zone provided.

currentUTC()
currentUTC('PST') /* Should be equivalent to toUTC(currentTimestamp(), 'PST') */
currentTimestamp() /* For me it returns timestamp in UTC even though my resource is in West US, but it's not the documented behavior. */

currentDate() /* Should return date in local time zone, however, for me it seems to be UTC */
currentDate('Asia/Jakarta') /* Gets the current date in that time zone */

Get Future Or Past Date/Timestamp

Task: Given a date or timestamp, create another timestamp which is some amount of time in the future or past relative to the given timestamp.

Pipeline Expression Language

Pipeline syntax contains a number of functions to add or subtract time from a timestamp:

NOTE: Time units are case-insensitive. In other words, both ‘Day’ and ‘day’ will work.

As with the most of the datetime functions in the pipeline expression language, we can provide a custom format for the output value.

addToTime('2022-09-30 10:11:00', 1, 'Minute') // Result: 2022-09-30T10:12:00Z
subtractFromTime('2022-09-30', 1, 'Day', 'yyyy-MM-dd') // Result: 2022-09-29

getFutureTime(1, 'Day')
getPastTime(12, 'Hour', 's')

Data Flow Expression Language

Dates and timestamps can be manipulated using add and minus functions. At the same time, we can use + and - operators which are more readable to achieve the same behavior.

We must use time duration when adding or subtracting time. The expression language contains functions to define duration in different time units: milliseconds, seconds, minutes, hours, days, weeks.

NOTE: Dates can be added with the number of days (just an integer), and there’s no need to use duration functions.

toTimestamp('2022-09-30 21:19:00') + hours(11) + minutes(5) - seconds(1) /* Result: 2022-10-01 08:23:59.000 */
toDate('2022-09-30') - 1 /* Result: 2022-09-29 */

Convert Datetime Between Time Zones

Task: Given timestamp in one time zone, convert it to a timestamp in the specified format.

Pipeline Expression Language

Timestamp conversion between two time zones is handled by the convertTimeZone function. Additionally, convertFromUtc and convertToUtc can be useful if working with UTC time zone.

Note that these functions also accept a format parameter, otherwise, the default format will be used for the output value.

convertTimeZone('2022-09-30 10:11:00', 'Pacific Standard Time', 'Eastern Standard Time') // Result: 2022-09-30T13:11:00Z
convertTimeZone('2022-09-30 10:11:00', 'Pacific Standard Time', 'Eastern Standard Time', 'MM/dd/yy H:mm:ss') // Result: 09/30/22 13:11:00

convertFromUtc('2022-09-30T23:19:00Z', 'South Africa Standard Time', 'd') // Result: 10/1/2022
convertToUtc('2022-09-30 10:11:00', 'Pacific Standard Time', 'yyyy-MM-dd HH:mm:ss') // Result: 2022-09-30 17:11:00

Data Flow Expression Language

Unfortunately, I couldn’t find a function which directly converts timestamp between two time zones. However, there are toUTC and fromUTC functions which can help us achieve time zone conversion by using UTC as an intermediary: sourceTimeZone → UTC → destinationTimeZone.

// fromUTC(toUTC(myTimestamp, 'sourceTimeZone'), 'destinationTimeZone')
fromUTC(toUTC(toTimestamp('2022-09-30 12:30:00'), 'PST'), 'Europe/Prague') /* Result: 2022-09-30 21:30:00.000 */

fromUTC(currentUTC())
fromUTC(currentUTC(), 'Asia/Singapore')

toUTC(currentTimestamp())
toUTC(timestampInPST, 'PST')

Check If Date Or Timestamp Is Valid

Task: Given a string, check whether this string represents a valid date or timestamp.

Pipeline Expression Language

As far as I know, there is no function that can test whether the date or timestamp is well-formed. Additionally, when using formatDateTime with a malformed string, it will fail the pipeline activity.

One possible option could be to use conditions like “Upon Success” or “Upon Failure” to handle failed activities. This way, we might even implement some try-catch logic, please read this doc for more details.

Data Flow Expression Language

Functions isTimestamp and isDate test the input string whether it represents a valid date or timestamp. The functions also accept format parameter if the input value is not in the default format.

Alternatively, you could use toDate or toTimestamp function and test its output if it’s null.

isTimestamp('2022-09-30 21:40:47') /* Result: true */
isTimestamp('2022-09-30T21:40:47.000', 'yyyy-MM-dd\'T\'HH:mm:ss.SSS') /* Result: true */
isTimestamp('foobar') /* Result: false */

isDate('2022-09-30') /* Result: true */
isDate('2022-13-30') /* Result: false */
isDate('9/30/2022', 'M/dd/yyyy') /* Result: true */

Appendix: List Of Data Flow’s TimeZone IDs

Below is a list of the time zone names which can be used in the date/timestamp functions of Data Flow expression syntax.

Values are retrieved by running TimeZone class’ getAvailableIDs() function using Java 8.

All Time Zones - Click to expand
    Africa/Abidjan
    Africa/AccraAfrica/Addis_Ababa
    Africa/Algiers
    Africa/Asmara
    Africa/Asmera
    Africa/Bamako
    Africa/Bangui
    Africa/Banjul
    Africa/Bissau
    Africa/Blantyre
    Africa/Brazzaville
    Africa/Bujumbura
    Africa/Cairo
    Africa/Casablanca
    Africa/Ceuta
    Africa/Conakry
    Africa/DakarAfrica/Dar_es_Salaam
    Africa/Djibouti
    Africa/DoualaAfrica/El_Aaiun
    Africa/Freetown
    Africa/Gaborone
    Africa/Harare
    Africa/Johannesburg
    Africa/JubaAfrica/Kampala
    Africa/Khartoum
    Africa/Kigali
    Africa/Kinshasa
    Africa/Lagos
    Africa/Libreville
    Africa/Lome
    Africa/Luanda
    Africa/Lubumbashi
    Africa/Lusaka
    Africa/MalaboAfrica/Maputo
    Africa/MaseruAfrica/Mbabane
    Africa/MogadishuAfrica/Monrovia
    Africa/Nairobi
    Africa/Ndjamena
    Africa/Niamey
    Africa/Nouakchott
    Africa/Ouagadougou
    Africa/Porto-Novo
    Africa/Sao_Tome
    Africa/Timbuktu
    Africa/Tripoli
    Africa/Tunis
    Africa/WindhoekAmerica/Adak
    America/AnchorageAmerica/Anguilla
    America/Antigua
    America/Araguaina
    America/Argentina/Buenos_Aires
    America/Argentina/CatamarcaAmerica/Argentina/ComodRivadavia
    America/Argentina/CordobaAmerica/Argentina/Jujuy
    America/Argentina/La_Rioja
    America/Argentina/MendozaAmerica/Argentina/Rio_Gallegos
    America/Argentina/Salta
    America/Argentina/San_Juan
    America/Argentina/San_Luis
    America/Argentina/Tucuman
    America/Argentina/Ushuaia
    America/Aruba
    America/AsuncionAmerica/Atikokan
    America/Atka
    America/BahiaAmerica/Bahia_Banderas
    America/Barbados
    America/BelemAmerica/Belize
    America/Blanc-Sablon
    America/Boa_VistaAmerica/Bogota
    America/BoiseAmerica/Buenos_AiresAmerica/Cambridge_Bay
    America/Campo_Grande
    America/Cancun
    America/CaracasAmerica/Catamarca
    America/CayenneAmerica/Cayman
    America/Chicago
    America/ChihuahuaAmerica/Coral_Harbour
    America/Cordoba
    America/Costa_RicaAmerica/Creston
    America/Cuiaba
    America/CuracaoAmerica/Danmarkshavn
    America/DawsonAmerica/Dawson_Creek
    America/Denver
    America/DetroitAmerica/Dominica
    America/EdmontonAmerica/Eirunepe
    America/El_SalvadorAmerica/Ensenada
    America/Fort_Nelson
    America/Fort_Wayne
    America/Fortaleza
    America/Glace_BayAmerica/GodthabAmerica/Goose_Bay
    America/Grand_Turk
    America/Grenada
    America/Guadeloupe
    America/Guatemala
    America/Guayaquil
    America/Guyana
    America/Halifax
    America/Havana
    America/Hermosillo
    America/Indiana/Indianapolis
    America/Indiana/Knox
    America/Indiana/Marengo
    America/Indiana/Petersburg
    America/Indiana/Tell_City
    America/Indiana/Vevay
    America/Indiana/VincennesAmerica/Indiana/Winamac
    America/Indianapolis
    America/Inuvik
    America/Iqaluit
    America/Jamaica
    America/Jujuy
    America/Juneau
    America/Kentucky/LouisvilleAmerica/Kentucky/Monticello
    America/Knox_IN
    America/Kralendijk
    America/La_Paz
    America/Lima
    America/Los_Angeles
    America/Louisville
    America/Lower_Princes
    America/Maceio
    America/Managua
    America/ManausAmerica/Marigot
    America/Martinique
    America/Matamoros
    America/Mazatlan
    America/Mendoza
    America/Menominee
    America/Merida
    America/Metlakatla
    America/Mexico_City
    America/Miquelon
    America/Moncton
    America/MonterreyAmerica/Montevideo
    America/Montreal
    America/Montserrat
    America/Nassau
    America/New_York
    America/Nipigon
    America/Nome
    America/Noronha
    America/North_Dakota/Beulah
    America/North_Dakota/Center
    America/North_Dakota/New_Salem
    America/NuukAmerica/Ojinaga
    America/Panama
    America/Pangnirtung
    America/Paramaribo
    America/Phoenix
    America/Port-au-Prince
    America/Port_of_Spain
    America/Porto_Acre
    America/Porto_Velho
    America/Puerto_Rico
    America/Punta_Arenas
    America/Rainy_River
    America/Rankin_Inlet
    America/Recife
    America/ReginaAmerica/ResoluteAmerica/Rio_Branco
    America/Rosario
    America/Santa_Isabel
    America/Santarem
    America/SantiagoAmerica/Santo_Domingo
    America/Sao_Paulo
    America/Scoresbysund
    America/Shiprock
    America/Sitka
    America/St_Barthelemy
    America/St_JohnsAmerica/St_Kitts
    America/St_Lucia
    America/St_Thomas
    America/St_Vincent
    America/Swift_Current
    America/Tegucigalpa
    America/Thule
    America/Thunder_Bay
    America/TijuanaAmerica/Toronto
    America/Tortola
    America/Vancouver
    America/Virgin
    America/Whitehorse
    America/Winnipeg
    America/Yakutat
    America/Yellowknife
    Antarctica/Casey
    Antarctica/Davis
    Antarctica/DumontDUrville
    Antarctica/Macquarie
    Antarctica/Mawson
    Antarctica/McMurdo
    Antarctica/Palmer
    Antarctica/Rothera
    Antarctica/South_Pole
    Antarctica/Syowa
    Antarctica/Troll
    Antarctica/Vostok
    Arctic/LongyearbyenAsia/Aden
    Asia/Almaty
    Asia/Amman
    Asia/Anadyr
    Asia/Aqtau
    Asia/Aqtobe
    Asia/AshgabatAsia/Ashkhabad
    Asia/AtyrauAsia/Baghdad
    Asia/Bahrain
    Asia/BakuAsia/Bangkok
    Asia/Barnaul
    Asia/BeirutAsia/Bishkek
    Asia/Brunei
    Asia/Calcutta
    Asia/Chita
    Asia/Choibalsan
    Asia/Chongqing
    Asia/ChungkingAsia/Colombo
    Asia/Dacca
    Asia/Damascus
    Asia/Dhaka
    Asia/DiliAsia/Dubai
    Asia/Dushanbe
    Asia/Famagusta
    Asia/Gaza
    Asia/Harbin
    Asia/HebronAsia/Ho_Chi_Minh
    Asia/Hong_Kong
    Asia/Hovd
    Asia/Irkutsk
    Asia/Istanbul
    Asia/Jakarta
    Asia/Jayapura
    Asia/Jerusalem
    Asia/Kabul
    Asia/Kamchatka
    Asia/Karachi
    Asia/KashgarAsia/Kathmandu
    Asia/Katmandu
    Asia/KhandygaAsia/Kolkata
    Asia/Krasnoyarsk
    Asia/Kuala_Lumpur
    Asia/Kuching
    Asia/Kuwait
    Asia/Macao
    Asia/Macau
    Asia/Magadan
    Asia/Makassar
    Asia/Manila
    Asia/MuscatAsia/Nicosia
    Asia/Novokuznetsk
    Asia/Novosibirsk
    Asia/Omsk
    Asia/Oral
    Asia/Phnom_PenhAsia/Pontianak
    Asia/Pyongyang
    Asia/Qatar
    Asia/Qostanay
    Asia/Qyzylorda
    Asia/Rangoon
    Asia/Riyadh
    Asia/SaigonAsia/Sakhalin
    Asia/Samarkand
    Asia/SeoulAsia/Shanghai
    Asia/Singapore
    Asia/Srednekolymsk
    Asia/Taipei
    Asia/Tashkent
    Asia/Tbilisi
    Asia/Tehran
    Asia/Tel_Aviv
    Asia/Thimbu
    Asia/Thimphu
    Asia/TokyoAsia/Tomsk
    Asia/Ujung_Pandang
    Asia/Ulaanbaatar
    Asia/Ulan_BatorAsia/Urumqi
    Asia/Ust-Nera
    Asia/Vientiane
    Asia/Vladivostok
    Asia/YakutskAsia/Yangon
    Asia/Yekaterinburg
    Asia/Yerevan
    Atlantic/Azores
    Atlantic/Bermuda
    Atlantic/CanaryAtlantic/Cape_Verde
    Atlantic/Faeroe
    Atlantic/Faroe
    Atlantic/Jan_MayenAtlantic/Madeira
    Atlantic/Reykjavik
    Atlantic/South_Georgia
    Atlantic/St_Helena
    Atlantic/Stanley
    Australia/ACT
    Australia/Adelaide
    Australia/Brisbane
    Australia/Broken_HillAustralia/Canberra
    Australia/Currie
    Australia/Darwin
    Australia/Eucla
    Australia/Hobart
    Australia/LHI
    Australia/Lindeman
    Australia/Lord_Howe
    Australia/MelbourneAustralia/NSW
    Australia/North
    Australia/Perth
    Australia/Queensland
    Australia/SouthAustralia/Sydney
    Australia/Tasmania
    Australia/Victoria
    Australia/West
    Australia/YancowinnaBrazil/Acre
    Brazil/DeNoronha
    Brazil/East
    Brazil/West
    CET
    CST6CDTCanada/Atlantic
    Canada/Central
    Canada/Eastern
    Canada/Mountain
    Canada/NewfoundlandCanada/Pacific
    Canada/Saskatchewan
    Canada/Yukon
    Chile/Continental
    Chile/EasterIsland
    Cuba
    EET
    EST5EDTEgypt
    Eire
    Etc/GMT
    Etc/GMT+0
    Etc/GMT+1Etc/GMT+10
    Etc/GMT+11
    Etc/GMT+12
    Etc/GMT+2
    Etc/GMT+3
    Etc/GMT+4
    Etc/GMT+5
    Etc/GMT+6
    Etc/GMT+7Etc/GMT+8
    Etc/GMT+9
    Etc/GMT-0
    Etc/GMT-1
    Etc/GMT-10
    Etc/GMT-11
    Etc/GMT-12
    Etc/GMT-13
    Etc/GMT-14
    Etc/GMT-2
    Etc/GMT-3
    Etc/GMT-4
    Etc/GMT-5
    Etc/GMT-6
    Etc/GMT-7
    Etc/GMT-8
    Etc/GMT-9
    Etc/GMT0
    Etc/Greenwich
    Etc/UCT
    Etc/UTC
    Etc/Universal
    Etc/Zulu
    Europe/Amsterdam
    Europe/Andorra
    Europe/Astrakhan
    Europe/Athens
    Europe/Belfast
    Europe/Belgrade
    Europe/Berlin
    Europe/Bratislava
    Europe/Brussels
    Europe/Bucharest
    Europe/Budapest
    Europe/Busingen
    Europe/Chisinau
    Europe/Copenhagen
    Europe/Dublin
    Europe/Gibraltar
    Europe/Guernsey
    Europe/Helsinki
    Europe/Isle_of_Man
    Europe/Istanbul
    Europe/JerseyEurope/Kaliningrad
    Europe/Kiev
    Europe/Kirov
    Europe/LisbonEurope/Ljubljana
    Europe/London
    Europe/Luxembourg
    Europe/Madrid
    Europe/Malta
    Europe/Mariehamn
    Europe/Minsk
    Europe/Monaco
    Europe/Moscow
    Europe/Nicosia
    Europe/Oslo
    Europe/Paris
    Europe/Podgorica
    Europe/Prague
    Europe/Riga
    Europe/Rome
    Europe/Samara
    Europe/San_Marino
    Europe/Sarajevo
    Europe/Saratov
    Europe/Simferopol
    Europe/Skopje
    Europe/Sofia
    Europe/Stockholm
    Europe/Tallinn
    Europe/Tirane
    Europe/TiraspolEurope/Ulyanovsk
    Europe/Uzhgorod
    Europe/Vaduz
    Europe/Vatican
    Europe/Vienna
    Europe/Vilnius
    Europe/Volgograd
    Europe/Warsaw
    Europe/Zagreb
    Europe/Zaporozhye
    Europe/Zurich
    GB
    GB-Eire
    GMT
    GMT0
    Greenwich
    Hongkong
    Iceland
    Indian/Antananarivo
    Indian/ChagosIndian/ChristmasIndian/Cocos
    Indian/Comoro
    Indian/KerguelenIndian/Mahe
    Indian/Maldives
    Indian/Mauritius
    Indian/Mayotte
    Indian/Reunion
    Iran
    Israel
    Jamaica
    Japan
    KwajaleinLibya
    MET
    MST7MDT
    Mexico/BajaNorte
    Mexico/BajaSur
    Mexico/General
    NZ
    NZ-CHAT
    Navajo
    PRC
    PST8PDT
    Pacific/Apia
    Pacific/Auckland
    Pacific/Bougainville
    Pacific/Chatham
    Pacific/Chuuk
    Pacific/Easter
    Pacific/Efate
    Pacific/Enderbury
    Pacific/Fakaofo
    Pacific/Fiji
    Pacific/Funafuti
    Pacific/Galapagos
    Pacific/Gambier
    Pacific/Guadalcanal
    Pacific/Guam
    Pacific/Honolulu
    Pacific/Johnston
    Pacific/Kiritimati
    Pacific/Kosrae
    Pacific/Kwajalein
    Pacific/Majuro
    Pacific/Marquesas
    Pacific/Midway
    Pacific/Nauru
    Pacific/Niue
    Pacific/Norfolk
    Pacific/Noumea
    Pacific/Pago_Pago
    Pacific/Palau
    Pacific/Pitcairn
    Pacific/Pohnpei
    Pacific/Ponape
    Pacific/Port_Moresby
    Pacific/Rarotonga
    Pacific/Saipan
    Pacific/Samoa
    Pacific/Tahiti
    Pacific/Tarawa
    Pacific/Tongatapu
    Pacific/Truk
    Pacific/Wake
    Pacific/Wallis
    Pacific/Yap
    Poland
    Portugal
    ROK
    Singapore
    SystemV/AST4
    SystemV/AST4ADT
    SystemV/CST6
    SystemV/CST6CDT
    SystemV/EST5
    SystemV/EST5EDT
    SystemV/HST10
    SystemV/MST7
    SystemV/MST7MDT
    SystemV/PST8
    SystemV/PST8PDT
    SystemV/YST9
    SystemV/YST9YDT
    Turkey
    UCT
    US/Alaska
    US/Aleutian
    US/Arizona
    US/Central
    US/East-Indiana
    US/Eastern
    US/Hawaii
    US/Indiana-Starke
    US/Michigan
    US/Mountain
    US/Pacific
    US/Samoa
    UTC
    Universal
    W-SU
    WET
    Zulu
    EST
    HST
    MST
    ACT
    AET
    AGT
    ART
    AST
    BET
    BST
    CAT
    CNT
    CST
    CTT
    EAT
    ECT
    IET
    IST
    JST
    MIT
    NET
    NST
    PLT
    PNT
    PRT
    PST
    SST
    VST