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
- Expression Languages: Pipeline vs Data Flow
- Dates And Timestamps In Azure Data Factory
- Examples Of Working With Date And Time In Azure Data Factory
- Related Posts
- Useful Links
- Appendix: List Of Data Flow’s TimeZone IDs
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
- By default, Data Factory’s date functions use ISO 8601 format for the return value, for example,
2022-09-30T21:53:00.0000000Z
. - If we want to get timestamp in a different format, one option is to pass a format specifier which is basically a one-character string like
'o'
or'D'
. Please find the list of all format specifiers here. - Another option is to specify a custom format you want the timestamp to be in, and this will be a string like
'yyyy-MM-ddTHH:mm:ss'
. The rules of creating such custom formats are described in this doc.
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:
- utcNow - returns current timestamp in the default format.
Examples:utcNow() utcNow('D') utcNow('yyyy-MM-ddTHH:mm:ss')
- addToTime, subtractFromTime - creates a new timestamp by taking the input timestamp and adding/subtracting the specified amount of time. Also, getFutureTime and getPastTime combine the above functions with utcNow which might be handy. Acceptable time units are:
Second
,Minute
,Hour
,Day
,Week
,Month
,Year
(string values are case-insensitive).
Examples:addToTime('2022-09-30 21:40:47', 3, 'Hour') subtractFromTime('2022-09-30 21:40:47', 3, 'Hour', 'yyyy-MM-ddTHH:mm:ss.fff')
- formatDateTime - converts the input timestamp in whatever format to the desired format (or default one if no custom one specified).
Examples:formatDateTime('2022-09-30 21:40:47', 's') formatDateTime('2022-09-30 21:40:47', 'yyyy-MM-dd')
- convertTimeZone - handles timestamp conversion between different time zones. Alternatively, there are shorthand functions for dealing with UTC: convertToUtc and convertFromUtc.
Examples:convertTimeZone('2022-09-30 21:40:47', 'UTC', 'Eastern Standard Time') convertTimeZone('2022-09-30 21:40:47', 'UTC', 'Eastern Standard Time', 'yyyy-MM-ddTHH:mm:ss.fff')
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:
- Date formats:
- Default:
'yyyy-[M]M-[d]d'
- Other accepted formats:
'yyyy'
,'yyyy-[M]M'
,'yyyy-[M]M-[d]dT*'
- Default:
- Timestamp formats:
- Default:
'yyyy-[M]M-[d]d HH:mm:ss[.S...]'
- Examples:
'yyyy-MM-dd HH:mm:ss'
,'yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\''
- Default:
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.
- currentUTC - gets the current timestamp in the UTC time zone (similar to utcNow function in the Pipeline expression language), can accept a time zone; currentTimestamp is doing the same but is supposed to use the local time zone of the machine.
Examples:currentUTC() currentUTC('PST') /* Treats the current time as if it’s in the provided time zone, should be equivalent to toUTC(currentTimestamp(), 'PST') */ currentTimestamp() /* Interestingly, for me this function returns time in UTC even though my ADF resource is in West US. It’s either the cluster is in UTC or this function always returns time in UTC time zone. */
- currentDate - returns the current date; by default, uses the local time zone of the machine, but you can also pass a time zone as a parameter so that it returns the current date in that specified time zone.
Examples:currentDate() currentDate('Europe/Berlin')
- toTimestamp - converts a string to a timestamp; if the string value isn’t in the default format, then we need to pass the format as well. Also, the function accepts a time zone of the timestamp, see examples below for details.
Examples:toTimestamp('2022-09-30 21:19:00') toTimestamp('2022-09-30T21:19:00', 'yyyy-MM-dd\'T\'HH:mm:ss') toTimestamp('2022-09-30T21:19:00', 'yyyy-MM-dd\'T\'HH:mm:ss', 'EST') /* Result: 2022-10-01 02:19:00.000 - treats input timestamp as if in EST time zone and returns value converted to UTC */
- toDate - converts a string to a date; similarly to the timestamp counterpart, if the string value is not in the default format, then we need to provide the format as well.
Examples:toDate('2022-9-26') /* Result: 2022-09-26 */ toDate('2022-09') /* Result: 2022-09-01 */ toDate('2022') /* Result: 2022-01-01 */ toDate('9/30/2022', 'MM/dd/yyyy') /* Result: 2022-09-30 */
- toString - converts a date or a timestamp to a string; can also accept a format and a locale in which the result should be displayed.
Examples:toString(myDate) toString(myDate, 'yyyy-MM-dd\'T\'HH:mm:ss') toString(myDate, 'EEE, MMM d, yyyy', 'fr-FR')
- fromUTC, toUTC - functions to convert timestamps between UTC and local time zones; accept a time zone as a parameter, see examples below.
Examples:fromUTC(currentUTC(), 'Europe/Berlin') toUTC(currentTimestamp())
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:
- If the input string value is not in the default format, we also need to provide its format as a parameter.
- Optionally, timestamp’s time zone value can be passed to 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:
- Output format for the date or timestamp, date formats section of this post contains more details about formats for dates and timestamps.
- Locale for the output format.
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:
- addToTime, subtractFromTime - provide a generic way to take a timestamp and create a new one some amount of time ahead or behind. There are also shorthand time unit specific functions: addSeconds, addMinutes, addHours, addDays.
- getFutureTime, getPastTime - these functions combine utcNow function with the two discussed in the previous paragraph.
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 */
Related Posts
- Pass Parameters To Azure Function From Data Factory: Body, Query, Headers, Path
- 3 Ways To Check If Data Exists Using ADF Data Flow - Azure Data Factory
Useful Links
- What is Azure Data Factory? | Microsoft Learn
- Expression and functions - Azure Data Factory & Azure Synapse | Microsoft Learn
- Mapping data flow functions - Azure Data Factory & Azure Synapse | Microsoft Learn
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