A.2. Time Zones

PostgreSQL contains internal tabular information for time zone decoding, since there is no *nix standard system interface to provide access to general, cross-timezone information. The underlying OS is used to provide time zone information for output, however.

The following table of time zones recognized by PostgreSQL is organized by time zone offset from UTC, rather than alphabetically; this is intended to facilitate matching local usage with recognized abbreviations for cases where these might differ.

Table A-4. PostgreSQL Recognized Time Zones

Time ZoneOffset from UTCDescription
NZDT+13:00New Zealand Daylight Time
IDLE+12:00International Date Line, East
NZST+12:00New Zealand Standard Time
NZT+12:00New Zealand Time
AESST+11:00Australia Eastern Summer Standard Time
ACSST+10:30Central Australia Summer Standard Time
CADT+10:30Central Australia Daylight Savings Time
SADT+10:30South Australian Daylight Time
AEST+10:00Australia Eastern Standard Time
EAST+10:00East Australian Standard Time
GST+10:00Guam Standard Time, USSR Zone 9
LIGT+10:00Melbourne, Australia
SAST+09:30South Australia Standard Time
CAST+09:30Central Australia Standard Time
AWSST+09:00Australia Western Summer Standard Time
JST+09:00Japan Standard Time,USSR Zone 8
KST+09:00Korea Standard Time
MHT+09:00Kwajalein Time
WDT+09:00West Australian Daylight Time
MT+08:30Moluccas Time
AWST+08:00Australia Western Standard Time
CCT+08:00China Coastal Time
WADT+08:00West Australian Daylight Time
WST+08:00West Australian Standard Time
JT+07:30Java Time
ALMST+07:00Almaty Summer Time
WAST+07:00West Australian Standard Time
CXT+07:00Christmas (Island) Time
ALMT+06:00Almaty Time
MAWT+06:00Mawson (Antarctica) Time
IOT+05:00Indian Chagos Time
MVT+05:00Maldives Island Time
TFT+05:00Kerguelen Time
AFT+04:30Afganistan Time
EAST+04:00Antananarivo Savings Time
MUT+04:00Mauritius Island Time
RET+04:00Reunion Island Time
SCT+04:00Mahe Island Time
IT+03:30Iran Time
EAT+03:00Antananarivo, Comoro Time
BT+03:00Baghdad Time
EETDST+03:00Eastern Europe Daylight Savings Time
HMT+03:00Hellas Mediterranean Time (?)
BDST+02:00British Double Standard Time
CEST+02:00Central European Savings Time
CETDST+02:00Central European Daylight Savings Time
EET+02:00Eastern Europe, USSR Zone 1
FWT+02:00French Winter Time
IST+02:00Israel Standard Time
MEST+02:00Middle Europe Summer Time
METDST+02:00Middle Europe Daylight Time
SST+02:00Swedish Summer Time
BST+01:00British Summer Time
CET+01:00Central European Time
DNT+01:00Dansk Normal Tid
FST+01:00French Summer Time
MET+01:00Middle Europe Time
MEWT+01:00Middle Europe Winter Time
MEZ+01:00Middle Europe Zone
NOR+01:00Norway Standard Time
SET+01:00Seychelles Time
SWT+01:00Swedish Winter Time
WETDST+01:00Western Europe Daylight Savings Time
GMT+00:00Greenwich Mean Time
UT+00:00Universal Time
UTC+00:00Universal Time, Coordinated
Z+00:00Same as UTC
ZULU+00:00Same as UTC
WET+00:00Western Europe
WAT-01:00West Africa Time
NDT-02:30Newfoundland Daylight Time
ADT-03:00Atlantic Daylight Time
AWT-03:00(unknown)
NFT-03:30Newfoundland Standard Time
NST-03:30Newfoundland Standard Time
AST-04:00Atlantic Standard Time (Canada)
ACST-04:00Atlantic/Porto Acre Summer Time
ACT-05:00Atlantic/Porto Acre Standard Time
EDT-04:00Eastern Daylight Time
CDT-05:00Central Daylight Time
EST-05:00Eastern Standard Time
CST-06:00Central Standard Time
MDT-06:00Mountain Daylight Time
MST-07:00Mountain Standard Time
PDT-07:00Pacific Daylight Time
AKDT-08:00Alaska Daylight Time
PST-08:00Pacific Standard Time
YDT-08:00Yukon Daylight Time
AKST-09:00Alaska Standard Time
HDT-09:00Hawaii/Alaska Daylight Time
YST-09:00Yukon Standard Time
AHST-10:00Alaska-Hawaii Standard Time
HST-10:00Hawaii Standard Time
CAT-10:00Central Alaska Time
NT-11:00Nome Time
IDLW-12:00International Date Line, West

A.2.1. Australian Time Zones

Australian time zones and their naming variants account for fully one quarter of all time zones in the PostgreSQL time zone lookup table. There are two naming conflicts with time zones commonly used in the United States, CST and EST.

If the runtime option AUSTRALIAN_TIMEZONES is set then CST, EST, and SAT will be interpreted as Australian timezone names. Without this option, CST and EST are taken as American timezone names, while SAT is interpreted as a noise word indicating Saturday.

A.2.2. Date/Time Input Interpretation

The date/time types are all decoded using a common set of routines.

Date/Time Input Interpretation

  1. Break the input string into tokens and categorize each token as a string, time, time zone, or number.

    1. If the numeric token contains a colon (":"), this is a time string. Include all subsequent digits and colons.

    2. If the numeric token contains a dash ("-"), slash ("/"), or two or more dots ("."), this is a date string which may have a text month.

    3. If the token is numeric only, then it is either a single field or an ISO-8601 concatenated date (e.g. 19990113 for January 13, 1999) or time (e.g. 141516 for 14:15:16).

    4. If the token starts with a plus ("+") or minus ("-"), then it is either a time zone or a special field.

  2. If the token is a text string, match up with possible strings.

    1. Do a binary-search table lookup for the token as either a special string (e.g. today), day (e.g. Thursday), month (e.g. January), or noise word (e.g. at, on).

      Set field values and bit mask for fields. For example, set year, month, day for today, and additionally hour, minute, second for now.

    2. If not found, do a similar binary-search table lookup to match the token with a time zone.

    3. If not found, throw an error.

  3. The token is a number or number field.

    1. If there are more than 4 digits, and if no other date fields have been previously read, then interpret as a "concatenated date" (e.g. 19990118). 8 and 6 digits are interpreted as year, month, and day, while 7 and 5 digits are interpreted as year, day of year, respectively.

    2. If the token is three digits and a year has already been decoded, then interpret as day of year.

    3. If four or six digits and a year has already been read, then interpret as a time.

    4. If four or more digits, then interpret as a year.

    5. If in European date mode, and if the day field has not yet been read, and if the value is less than or equal to 31, then interpret as a day.

    6. If the month field has not yet been read, and if the value is less than or equal to 12, then interpret as a month.

    7. If the day field has not yet been read, and if the value is less than or equal to 31, then interpret as a day.

    8. If two digits or four or more digits, then interpret as a year.

    9. Otherwise, throw an error.

  4. If BC has been specified, negate the year and add one for internal storage (there is no year zero in the Gregorian calendar, so numerically 1BC becomes year zero).

  5. If BC was not specified, and if the year field was two digits in length, then adjust the year to 4 digits. If the field was less than 70, then add 2000; otherwise, add 1900.