提交 d8b5c95c 编写于 作者: T Tom Lane

Remove hard-wired lists of timezone abbreviations in favor of providing

configuration files that can be altered by a DBA.  The australian_timezones
GUC setting disappears, replaced by a timezone_abbreviations setting (set this
to 'Australia' to get the effect of australian_timezones).  The list of zone
names defined by default has undergone a bit of cleanup, too.  Documentation
still needs some work --- in particular, should we fix Table B-4, or just get
rid of it?  Joachim Wieland, with some editorializing by moi.
上级 631ea618
<!-- $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.126 2006/07/10 16:20:49 alvherre Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.127 2006/07/25 03:51:21 tgl Exp $ -->
<!--
Documentation of the system catalogs, directed toward PostgreSQL developers
-->
......@@ -4559,6 +4559,11 @@
<entry>tables</entry>
</row>
<row>
<entry><link linkend="view-pg-timezonenames"><structname>pg_timezonenames</structname></link></entry>
<entry>time zone abbreviations</entry>
</row>
<row>
<entry><link linkend="view-pg-user"><structname>pg_user</structname></link></entry>
<entry>database users</entry>
......@@ -5869,6 +5874,53 @@
</sect1>
<sect1 id="view-pg-timezonenames">
<title><structname>pg_timezonenames</structname></title>
<indexterm zone="view-pg-timezonenames">
<primary>pg_timezonenames</primary>
</indexterm>
<para>
The view <structname>pg_timezonenames</structname> provides a list
of time zone abbreviations that are currently recognized by the datetime
input routines. The contents of this view change when the
<xref linkend="guc-timezone-abbreviations"> run-time parameter is modified.
</para>
<table>
<title><structname>pg_timezonenames</> Columns</title>
<tgroup cols=3>
<thead>
<row>
<entry>Name</entry>
<entry>Type</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><structfield>name</structfield></entry>
<entry><type>text</type></entry>
<entry>time zone abbreviation</entry>
</row>
<row>
<entry><structfield>utc_offset</structfield></entry>
<entry><type>interval</type></entry>
<entry>offset from UTC (positive means east of Greenwich)</entry>
</row>
<row>
<entry><structfield>is_dst</structfield></entry>
<entry><type>boolean</type></entry>
<entry>true if this is a daylight-savings zone</entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>
<sect1 id="view-pg-user">
<title><structname>pg_user</structname></title>
......
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.68 2006/06/27 22:16:43 momjian Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.69 2006/07/25 03:51:21 tgl Exp $ -->
<chapter Id="runtime-config">
<title>Server Configuration</title>
......@@ -3410,19 +3410,20 @@ SELECT * FROM parent WHERE key = 2400;
</listitem>
</varlistentry>
<varlistentry id="guc-australian-timezones" xreflabel="australian_timezones">
<term><varname>australian_timezones</varname> (<type>boolean</type>)</term>
<varlistentry id="guc-timezone-abbreviations" xreflabel="timezone_abbreviations">
<term><varname>timezone_abbreviations</varname> (<type>string</type>)</term>
<indexterm>
<primary><varname>australian_timezones</> configuration parameter</primary>
<primary><varname>timezone_abbreviations</> configuration parameter</primary>
</indexterm>
<indexterm><primary>time zone</><secondary>Australian</></>
<indexterm><primary>time zone names</></>
<listitem>
<para>
If set to on, <literal>ACST</literal>,
<literal>CST</literal>, <literal>EST</literal>, and
<literal>SAT</literal> are interpreted as Australian time
zones rather than as North/South American time zones and
Saturday. The default is <literal>off</>.
Sets the collection of time zone abbreviations that will be accepted
by the server for datetime input. The default is 'Default',
which is a collection that works in most of the world; there are
also 'Australia' and 'India', and other collections can be defined
for a particular installation. See <xref
linkend="datetime-appendix"> for more information.
</para>
</listitem>
</varlistentry>
......
<!-- $PostgreSQL: pgsql/doc/src/sgml/datetime.sgml,v 2.50 2006/07/06 01:46:37 momjian Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/datetime.sgml,v 2.51 2006/07/25 03:51:21 tgl Exp $ -->
<appendix id="datetime-appendix">
<title>Date/Time Support</title>
......@@ -361,15 +361,25 @@
</indexterm>
<para>
<xref linkend="datetime-timezone-input-table"> and
<xref linkend="datetime-timezone-full-names-table"> show the time zone
<xref linkend="datetime-timezone-input-table"> shows the time zone
abbreviations recognized by <productname>PostgreSQL</productname>
in date/time input values. Note that these names are <emphasis>not</>
necessarily used for date/time output &mdash; output is driven by the
official timezone abbreviation(s) associated with the currently selected
<xref linkend="guc-timezone"> parameter setting. (It is
likely that future releases will make some use of <varname>timezone</>
for input as well.)
in date/time input values. These abbreviations are not
hard-wired into the server, but are obtained from a configuration
file (see <xref linkend="datetime-config-files">). Note that these
names are <emphasis>not</> used for date/time output &mdash; all supported
output formats use numeric timezone displays to avoid ambiguity.
</para>
<para>
In addition to these abbreviations, the full timezone names shown in
<xref linkend="datetime-timezone-full-names-table"> can be used
in date/time input values. There is a conceptual and
practical difference between the abbreviations and the full names:
abbreviations always represent a fixed offset from UTC, whereas most
of the full names imply a local daylight-savings time rule and so
have two possible UTC offsets. That's why
you always have to specify a date if you want to use full time zone
names in <type>timetz</> values.
</para>
<para>
......@@ -925,61 +935,6 @@
</tgroup>
</table>
<formalpara>
<title>Australian Time Zones</title>
<para>
There are three naming conflicts between Australian time zone
names and time zone names commonly used in North and South America:
<literal>ACST</literal>, <literal>CST</literal>, and
<literal>EST</literal>. If the run-time option
<varname>australian_timezones</varname> is set to true then
<literal>ACST</literal>, <literal>CST</literal>,
<literal>EST</literal>, and <literal>SAT</literal> are interpreted
as Australian time zone names, as shown in <xref
linkend="datetime-oztz-table">. If it is false (which is the
default), then <literal>ACST</literal>, <literal>CST</literal>,
and <literal>EST</literal> are taken as American time zone names,
and <literal>SAT</literal> is interpreted as a noise word
indicating Saturday.
</para>
</formalpara>
<table id="datetime-oztz-table">
<title>Australian Time Zone Abbreviations for Input</title>
<tgroup cols="3">
<thead>
<row>
<entry>Time Zone</entry>
<entry>Offset from UTC</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>ACST</entry>
<entry>+09:30</entry>
<entry>Central Australia Standard Time</entry>
</row>
<row>
<entry>CST</entry>
<entry>+10:30</entry>
<entry>Australian Central Standard Time</entry>
</row>
<row>
<entry>EST</entry>
<entry>+10:00</entry>
<entry>Australian Eastern Standard Time</entry>
</row>
<row>
<entry>SAT</entry>
<entry>+09:30</entry>
<entry>South Australian Standard Time</entry>
</row>
</tbody>
</tgroup>
</table>
<indexterm>
<primary>time zone</primary>
<secondary>configuration names</secondary>
......@@ -988,13 +943,10 @@
<para>
<xref linkend="datetime-timezone-full-names-table"> shows the time zone
names recognized by <productname>PostgreSQL</productname> as valid
settings for the <xref linkend="guc-timezone"> parameter. Note that
these names are conceptually as well as practically different from
the names shown in <xref linkend="datetime-timezone-input-table">:
most of these names imply a local daylight-savings time rule, whereas
the former names each represent just a fixed offset from UTC. That's why
you always have to specify a date if you want to use these time zone
names in <type>timetz</> values.
settings for the <xref linkend="guc-timezone"> parameter. These names
are not hard-wired into the server, but are in fact names of configuration
files stored under <filename>.../share/timezone/</> of the installation
directory.
</para>
<para>
......@@ -1004,7 +956,7 @@
</para>
<table id="datetime-timezone-full-names-table">
<title>Time Zone Names for date/time input values and for setting <varname>timezone</></title>
<title>Time Zone Names for setting <varname>timezone</></title>
<tgroup cols="1">
<thead>
<row>
......@@ -2230,7 +2182,8 @@
<para>
In addition to the names listed in the table,
<productname>PostgreSQL</productname> will accept time zone names of the
<productname>PostgreSQL</productname> will accept
<xref linkend="guc-timezone"> values of the
form <replaceable>STD</><replaceable>offset</> or
<replaceable>STD</><replaceable>offset</><replaceable>DST</>, where
<replaceable>STD</> is a zone abbreviation, <replaceable>offset</> is a
......@@ -2250,6 +2203,108 @@
</sect1>
<sect1 id="datetime-config-files">
<title>Date/Time Configuration Files</title>
<para>
Since timezone abbreviations are not well standardized,
<productname>PostgreSQL</productname> provides a means to customize
the set of abbreviations accepted by the server. The
<xref linkend="guc-timezone-abbreviations"> run-time parameter
determines the active set of abbreviations. While this parameter
can be altered by any database user, the possible values for it
are under the control of the database administrator &mdash; they
are in fact names of configuration files stored in
<filename>.../share/timezonesets/</> of the installation directory.
By adding or altering files in that directory, the administrator
can set local policy for timezone abbreviations.
</para>
<para>
<literal>timezone_abbreviations</> can be set to any file name
found in <filename>.../share/timezonesets/</>, if the file's name
is entirely alphabetic. (The prohibition against non-alphabetic
characters in <literal>timezone_abbreviations</> prevents reading
files outside the intended directory, as well as reading editor
backup files and other extraneous files.)
</para>
<para>
A timezone abbreviation file may contain blank lines and comments
beginning with <literal>#</>. Non-comment lines must have one of
these formats:
<synopsis>
<replaceable>time_zone_name</replaceable> <replaceable>offset</replaceable>
<replaceable>time_zone_name</replaceable> <replaceable>offset</replaceable> D
@INCLUDE <replaceable>file_name</replaceable>
@OVERRIDE
</synopsis>
</para>
<para>
A <replaceable>time_zone_name</replaceable> is just the abbreviation
being defined. The <replaceable>offset</replaceable> is the zone's
offset in seconds from UTC, positive being east from Greenwich and
negative being west. For example, -18000 would be five hours west
of Greenwich, or North American east coast standard time. <literal>D</>
indicates that the zone name represents local daylight-savings time
rather than standard time.
</para>
<para>
The <literal>@INCLUDE</> syntax allows inclusion of another file in the
<filename>.../share/timezonesets/</> directory. Inclusion can be nested,
to a limited depth.
</para>
<para>
The <literal>@OVERRIDE</> syntax indicates that subsequent entries in the
file may override previous entries (i.e., entries obtained from included
files). Without this, conflicting definitions of the same timezone
abbreviation are considered an error.
</para>
<para>
In an unmodified installation, the file <filename>Default</> contains
all the non-conflicting time zone abbreviations for most of the world.
Additional files <filename>Australia</> and <filename>India</> are
provided for those regions: these files first include the
<literal>Default</> file and then add or modify timezones as needed.
</para>
<para>
For reference purposes, a standard installation also contains files
<filename>Africa.txt</>, <filename>America.txt</>, etc, containing
information about every time zone abbreviation known to be in use
according to the <literal>zic</> timezone database. The zone name
definitions found in these files can be copied and pasted into a custom
configuration file as needed. Note that these files cannot be directly
referenced as <literal>timezone_abbreviations</> settings, because of
the dot embedded in their names.
</para>
<caution>
<para>
Time zone abbreviations defined in the configuration file override
non-timezone meanings built into <productname>PostgreSQL</productname>.
For example, the <filename>Australia</> configuration file defines
<literal>SAT</> (for South Australian Standard Time). When this
file is active, <literal>SAT</> will not be recognized as an abbreviation
for Saturday.
</para>
</caution>
<caution>
<para>
If you modify files in <filename>.../share/timezonesets/</>,
it is up to you to make backups &mdash; a normal database dump
will not include this directory.
</para>
</caution>
</sect1>
<sect1 id="datetime-units-history">
<title>History of Units</title>
......
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/show.sgml,v 1.40 2006/06/18 15:38:36 petere Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/show.sgml,v 1.41 2006/07/25 03:51:21 tgl Exp $
PostgreSQL documentation
-->
......@@ -168,7 +168,6 @@ SHOW ALL;
--------------------------------+--------------------------------+----------------------------------------------------------------------------------------------
add_missing_from | off | Automatically adds missing table references to FROM clauses.
archive_command | unset | WAL archiving command.
australian_timezones | off | Interprets ACST, CST, EST, and SAT as Australian time zones.
.
.
.
......
......@@ -3,7 +3,7 @@
*
* Copyright (c) 1996-2006, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.27 2006/05/19 19:08:26 alvherre Exp $
* $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.28 2006/07/25 03:51:21 tgl Exp $
*/
CREATE VIEW pg_roles AS
......@@ -186,6 +186,11 @@ CREATE RULE pg_settings_n AS
GRANT SELECT, UPDATE ON pg_settings TO PUBLIC;
CREATE VIEW pg_timezonenames AS
SELECT *
FROM pg_timezonenames() AS T
(name text, utc_offset interval, is_dst boolean);
-- Statistics views
CREATE VIEW pg_stat_all_tables AS
......
此差异已折叠。
......@@ -4,7 +4,7 @@
# Makefile for utils/misc
#
# IDENTIFICATION
# $PostgreSQL: pgsql/src/backend/utils/misc/Makefile,v 1.25 2006/03/07 01:03:12 tgl Exp $
# $PostgreSQL: pgsql/src/backend/utils/misc/Makefile,v 1.26 2006/07/25 03:51:21 tgl Exp $
#
#-------------------------------------------------------------------------
......@@ -14,7 +14,7 @@ include $(top_builddir)/src/Makefile.global
override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
OBJS = guc.o help_config.o pg_rusage.o ps_status.o superuser.o
OBJS = guc.o help_config.o pg_rusage.o ps_status.o superuser.o tzparser.o
# This location might depend on the installation directories. Therefore
# we can't subsitute it into pg_config.h.
......
......@@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.328 2006/07/14 14:52:25 momjian Exp $
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.329 2006/07/25 03:51:21 tgl Exp $
*
*--------------------------------------------------------------------
*/
......@@ -26,6 +26,7 @@
#endif
#include "access/gin.h"
#include "access/twophase.h"
#include "access/xact.h"
#include "catalog/namespace.h"
......@@ -57,7 +58,7 @@
#include "utils/memutils.h"
#include "utils/pg_locale.h"
#include "utils/ps_status.h"
#include "access/gin.h"
#include "utils/tzparser.h"
#ifndef PG_KRB_SRVTAB
#define PG_KRB_SRVTAB ""
......@@ -131,6 +132,7 @@ static bool assign_log_stats(bool newval, bool doit, GucSource source);
static bool assign_transaction_read_only(bool newval, bool doit, GucSource source);
static const char *assign_canonical_path(const char *newval, bool doit, GucSource source);
static const char *assign_backslash_quote(const char *newval, bool doit, GucSource source);
static const char *assign_timezone_abbreviations(const char *newval, bool doit, GucSource source);
static bool assign_tcp_keepalives_idle(int newval, bool doit, GucSource source);
static bool assign_tcp_keepalives_interval(int newval, bool doit, GucSource source);
......@@ -163,8 +165,6 @@ bool log_btree_build_stats = false;
bool SQL_inheritance = true;
bool Australian_timezones = false;
bool Password_encryption = true;
bool default_with_oids = false;
......@@ -216,6 +216,7 @@ static char *timezone_string;
static char *XactIsoLevel_string;
static char *data_directory;
static char *custom_variable_classes;
static char *timezone_abbreviations;
static int max_function_args;
static int max_index_keys;
static int max_identifier_length;
......@@ -806,15 +807,6 @@ static struct config_bool ConfigureNamesBool[] =
&SQL_inheritance,
true, NULL, NULL
},
{
{"australian_timezones", PGC_USERSET, CLIENT_CONN_LOCALE,
gettext_noop("Interprets ACST, CST, EST, and SAT as Australian time zones."),
gettext_noop("Otherwise they are interpreted as North/South American "
"time zones and Saturday.")
},
&Australian_timezones,
false, ClearDateCache, NULL
},
{
{"password_encryption", PGC_USERSET, CONN_AUTH_SECURITY,
gettext_noop("Encrypt passwords."),
......@@ -2077,6 +2069,14 @@ static struct config_string ConfigureNamesString[] =
&timezone_string,
"UNKNOWN", assign_timezone, show_timezone
},
{
{"timezone_abbreviations", PGC_USERSET, CLIENT_CONN_LOCALE,
gettext_noop("Selects a file of timezone abbreviations"),
NULL,
},
&timezone_abbreviations,
"Default", assign_timezone_abbreviations, NULL
},
{
{"transaction_isolation", PGC_USERSET, CLIENT_CONN_STATEMENT,
......@@ -6101,6 +6101,30 @@ assign_backslash_quote(const char *newval, bool doit, GucSource source)
return newval;
}
static const char *
assign_timezone_abbreviations(const char *newval, bool doit, GucSource source)
{
/* Loading abbrev file is expensive, so only do it when value changes */
if (timezone_abbreviations == NULL ||
strcmp(timezone_abbreviations, newval) != 0)
{
int elevel;
/*
* If reading config file, only the postmaster should bleat loudly
* about problems. Otherwise, it's just this one process doing it,
* and we use WARNING message level.
*/
if (source == PGC_S_FILE)
elevel = IsUnderPostmaster ? DEBUG2 : LOG;
else
elevel = WARNING;
if (!load_tzoffsets(newval, doit, elevel))
return NULL;
}
return newval;
}
static bool
assign_tcp_keepalives_idle(int newval, bool doit, GucSource source)
{
......
......@@ -397,7 +397,13 @@
#datestyle = 'iso, mdy'
#timezone = unknown # actually, defaults to TZ
# environment setting
#australian_timezones = off
#timezone_abbreviations = 'Default' # select the set of available timezone
# abbreviations. Currently, there are
# Default
# Australia
# India
# However you can also create your own
# file in share/timezonesets/.
#extra_float_digits = 0 # min -15, max 2
#client_encoding = sql_ascii # actually, defaults to database
# encoding
......
/*-------------------------------------------------------------------------
*
* tzparser.c
* Functions for parsing timezone offset files
*
* Note: we generally should not throw any errors in this file, but instead
* try to return an error code. This is not completely bulletproof at
* present --- in particular out-of-memory will throw an error. Could
* probably fix with PG_TRY if necessary.
*
*
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/misc/tzparser.c,v 1.1 2006/07/25 03:51:21 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include <ctype.h>
#include "miscadmin.h"
#include "storage/fd.h"
#include "utils/datetime.h"
#include "utils/memutils.h"
#include "utils/tzparser.h"
#define WHITESPACE " \t\n\r"
static int tz_elevel; /* to avoid passing this around a lot */
static bool validateTzEntry(tzEntry *tzentry);
static bool splitTzLine(const char *filename, int lineno,
char *line, tzEntry *tzentry);
static int addToArray(tzEntry **base, int *arraysize, int n,
tzEntry *entry, bool override);
static int ParseTzFile(const char *filename, int depth,
tzEntry **base, int *arraysize, int n);
/*
* Apply additional validation checks to a tzEntry
*
* Returns TRUE if OK, else false
*/
static bool
validateTzEntry(tzEntry *tzentry)
{
unsigned char *p;
/*
* Check restrictions imposed by datetkntbl storage format (see datetime.c)
*/
if (strlen(tzentry->abbrev) > TOKMAXLEN)
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d",
tzentry->abbrev, TOKMAXLEN,
tzentry->filename, tzentry->lineno)));
return false;
}
if (tzentry->offset % 900 != 0)
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("time zone offset %d is not a multiple of 900 sec (15 min) in time zone file \"%s\", line %d",
tzentry->offset,
tzentry->filename, tzentry->lineno)));
return false;
}
/*
* Sanity-check the offset: shouldn't exceed 14 hours
*/
if (tzentry->offset > 14*60*60 ||
tzentry->offset < -14*60*60)
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("time zone offset %d is out of range in time zone file \"%s\", line %d",
tzentry->offset,
tzentry->filename, tzentry->lineno)));
return false;
}
/*
* Convert abbrev to lowercase (must match datetime.c's conversion)
*/
for (p = (unsigned char *) tzentry->abbrev; *p; p++)
*p = pg_tolower(*p);
return true;
}
/*
* Attempt to parse the line as a timezone abbrev spec (name, offset, dst)
*
* Returns TRUE if OK, else false; data is stored in *tzentry
*/
static bool
splitTzLine(const char *filename, int lineno, char *line, tzEntry *tzentry)
{
char *abbrev;
char *offset;
char *offset_endptr;
char *remain;
char *is_dst;
tzentry->lineno = lineno;
tzentry->filename = filename;
abbrev = strtok(line, WHITESPACE);
if (!abbrev)
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("missing time zone abbreviation in time zone file \"%s\", line %d",
filename, lineno)));
return false;
}
tzentry->abbrev = abbrev;
offset = strtok(NULL, WHITESPACE);
if (!offset)
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("missing time zone offset in time zone file \"%s\", line %d",
filename, lineno)));
return false;
}
tzentry->offset = strtol(offset, &offset_endptr, 10);
if (offset_endptr == offset || *offset_endptr != '\0')
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid number for time zone offset in time zone file \"%s\", line %d",
filename, lineno)));
return false;
}
is_dst = strtok(NULL, WHITESPACE);
if (is_dst && pg_strcasecmp(is_dst, "D") == 0)
{
tzentry->is_dst = true;
remain = strtok(NULL, WHITESPACE);
}
else
{
/* there was no 'D' dst specifier */
tzentry->is_dst = false;
remain = is_dst;
}
if (!remain) /* no more non-whitespace chars */
return true;
if (remain[0] != '#') /* must be a comment */
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid syntax in time zone file \"%s\", line %d",
filename, lineno)));
return false;
}
return true;
}
/*
* Insert entry into sorted array
*
* *base: base address of array (changeable if must enlarge array)
* *arraysize: allocated length of array (changeable if must enlarge array)
* n: current number of valid elements in array
* entry: new data to insert
* override: TRUE if OK to override
*
* Returns the new array length (new value for n), or -1 if error
*/
static int
addToArray(tzEntry **base, int *arraysize, int n,
tzEntry *entry, bool override)
{
tzEntry* arrayptr;
int low;
int high;
/*
* Search the array for a duplicate; as a useful side effect, the array
* is maintained in sorted order. We use strcmp() to ensure we match
* the sort order datetime.c expects.
*/
arrayptr = *base;
low = 0;
high = n-1;
while (low <= high)
{
int mid = (low + high) >> 1;
tzEntry *midptr = arrayptr + mid;
int cmp;
cmp = strcmp(entry->abbrev, midptr->abbrev);
if (cmp < 0)
high = mid - 1;
else if (cmp > 0)
low = mid + 1;
else
{
/*
* Found a duplicate entry; complain unless it's the same.
*/
if (midptr->offset == entry->offset &&
midptr->is_dst == entry->is_dst)
{
/* return unchanged array */
return n;
}
if (override)
{
/* same abbrev but something is different, override */
midptr->offset = entry->offset;
midptr->is_dst = entry->is_dst;
return n;
}
/* same abbrev but something is different, complain */
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("time zone abbreviation \"%s\" is multiply defined",
entry->abbrev),
errdetail("Time zone file \"%s\", line %d conflicts with file \"%s\", line %d.",
midptr->filename, midptr->lineno,
entry->filename, entry->lineno)));
return -1;
}
}
/*
* No match, insert at position "low".
*/
if (n >= *arraysize)
{
*arraysize *= 2;
*base = (tzEntry *) repalloc(*base, *arraysize * sizeof(tzEntry));
}
arrayptr = *base + low;
memmove(arrayptr + 1, arrayptr, (n - low) * sizeof(tzEntry));
memcpy(arrayptr, entry, sizeof(tzEntry));
/* Must dup the abbrev to ensure it survives */
arrayptr->abbrev = pstrdup(entry->abbrev);
return n+1;
}
/*
* Parse a single timezone abbrev file --- can recurse to handle @INCLUDE
*
* filename: user-specified file name (does not include path)
* depth: current recursion depth
* *base: array for results (changeable if must enlarge array)
* *arraysize: allocated length of array (changeable if must enlarge array)
* n: current number of valid elements in array
*
* Returns the new array length (new value for n), or -1 if error
*/
static int
ParseTzFile(const char *filename, int depth,
tzEntry **base, int *arraysize, int n)
{
char share_path[MAXPGPATH];
char file_path[MAXPGPATH];
FILE *tzFile;
char tzbuf[1024];
char *line;
tzEntry tzentry;
int lineno = 0;
bool override = false;
const char *p;
/*
* We enforce that the filename is all alpha characters. This may be
* overly restrictive, but we don't want to allow access to anything
* outside the timezonesets directory, so for instance '/' *must* be
* rejected.
*/
for (p = filename; *p; p++)
{
if (!isalpha((unsigned char) *p))
{
/* at level 0, we need no ereport since guc.c will say enough */
if (depth > 0)
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid time zone file name \"%s\"",
filename)));
return -1;
}
}
/*
* The maximal recursion depth is a pretty arbitrary setting.
* It is hard to imagine that someone needs more than 3 levels so stick
* with this conservative setting until someone complains.
*/
if (depth > 3)
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("time zone file recursion limit exceeded in file \"%s\"",
filename)));
return -1;
}
get_share_path(my_exec_path, share_path);
snprintf(file_path, sizeof(file_path), "%s/timezonesets/%s",
share_path, filename);
tzFile = AllocateFile(file_path, "r");
if (!tzFile)
{
/* at level 0, if file doesn't exist, guc.c's complaint is enough */
if (errno != ENOENT || depth > 0)
ereport(tz_elevel,
(errcode_for_file_access(),
errmsg("could not read time zone file \"%s\": %m",
filename)));
return -1;
}
while (!feof(tzFile))
{
lineno++;
if (fgets(tzbuf, sizeof(tzbuf), tzFile) == NULL)
{
if (ferror(tzFile))
{
ereport(tz_elevel,
(errcode_for_file_access(),
errmsg("could not read time zone file \"%s\": %m",
filename)));
return -1;
}
/* else we're at EOF after all */
break;
}
if (strlen(tzbuf) == sizeof(tzbuf)-1)
{
/* the line is too long for tzbuf */
ereport(tz_elevel,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("line is too long in time zone file \"%s\", line %d",
filename, lineno)));
return -1;
}
/* skip over whitespace */
line = tzbuf;
while (*line && isspace((unsigned char) *line))
line++;
if (*line == '\0') /* empty line */
continue;
if (*line == '#') /* comment line */
continue;
if (pg_strncasecmp(line, "@INCLUDE", strlen("@INCLUDE")) == 0)
{
/* pstrdup so we can use filename in result data structure */
char* includeFile = pstrdup(line + strlen("@INCLUDE"));
includeFile = strtok(includeFile, WHITESPACE);
if (!includeFile || !*includeFile)
{
ereport(tz_elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("@INCLUDE without filename in time zone file \"%s\", line %d",
filename, lineno)));
return -1;
}
n = ParseTzFile(includeFile, depth + 1,
base, arraysize, n);
if (n < 0)
return -1;
continue;
}
if (pg_strncasecmp(line, "@OVERRIDE", strlen("@OVERRIDE")) == 0)
{
override = true;
continue;
}
if (!splitTzLine(filename, lineno, line, &tzentry))
return -1;
if (!validateTzEntry(&tzentry))
return -1;
n = addToArray(base, arraysize, n, &tzentry, override);
if (n < 0)
return -1;
}
FreeFile(tzFile);
return n;
}
/*
* load_tzoffsets --- read and parse the specified timezone offset file
*
* filename: name specified by user
* doit: whether to actually apply the new values, or just check
* elevel: elog reporting level (will be less than ERROR)
*
* Returns TRUE if OK, FALSE if not; should avoid erroring out
*/
bool
load_tzoffsets(const char *filename, bool doit, int elevel)
{
MemoryContext tmpContext;
MemoryContext oldContext;
tzEntry *array;
int arraysize;
int n;
tz_elevel = elevel;
/*
* Create a temp memory context to work in. This makes it easy to
* clean up afterwards.
*/
tmpContext = AllocSetContextCreate(CurrentMemoryContext,
"TZParserMemory",
ALLOCSET_SMALL_MINSIZE,
ALLOCSET_SMALL_INITSIZE,
ALLOCSET_SMALL_MAXSIZE);
oldContext = MemoryContextSwitchTo(tmpContext);
/* Initialize array at a reasonable size */
arraysize = 128;
array = (tzEntry *) palloc(arraysize * sizeof(tzEntry));
/* Parse the file(s) */
n = ParseTzFile(filename, 0, &array, &arraysize, 0);
/* If no errors and we should apply the result, pass it to datetime.c */
if (n >= 0 && doit)
InstallTimeZoneAbbrevs(array, n);
/* Clean up */
MemoryContextSwitchTo(oldContext);
MemoryContextDelete(tmpContext);
return (n >= 0);
}
......@@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.339 2006/07/21 20:51:33 tgl Exp $
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.340 2006/07/25 03:51:21 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 200607211
#define CATALOG_VERSION_NO 200607241
#endif
......@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.416 2006/07/21 20:51:33 tgl Exp $
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.417 2006/07/25 03:51:21 tgl Exp $
*
* NOTES
* The script catalog/genbki.sh reads this file and generates .bki
......@@ -3731,6 +3731,8 @@ DATA(insert OID = 2510 ( pg_prepared_statement PGNSP PGUID 12 f f t t s 0 2249
DESCR("get the prepared statements for this session");
DATA(insert OID = 2511 ( pg_cursor PGNSP PGUID 12 f f t t s 0 2249 "" _null_ _null_ _null_ pg_cursor - _null_ ));
DESCR("get the open cursors for this session");
DATA(insert OID = 2599 ( pg_timezonenames PGNSP PGUID 12 f f t t s 0 2249 "" _null_ _null_ _null_ pg_timezonenames - _null_ ));
DESCR("get the available time zone names");
/* non-persistent series generator */
DATA(insert OID = 1066 ( generate_series PGNSP PGUID 12 f f t t v 3 23 "23 23 23" _null_ _null_ _null_ generate_series_step_int4 - _null_ ));
......
......@@ -9,7 +9,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/utils/datetime.h,v 1.59 2006/06/06 16:20:11 momjian Exp $
* $PostgreSQL: pgsql/src/include/utils/datetime.h,v 1.60 2006/07/25 03:51:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -20,6 +20,7 @@
#include <math.h>
#include "utils/timestamp.h"
#include "utils/tzparser.h"
/* ----------------------------------------------------------------
......@@ -300,5 +301,8 @@ extern int DecodeUnits(int field, char *lowtoken, int *val);
extern int j2day(int jd);
extern bool CheckDateTokenTables(void);
extern void InstallTimeZoneAbbrevs(tzEntry *abbrevs, int n);
extern Datum pg_timezonenames(PG_FUNCTION_ARGS);
#endif /* DATETIME_H */
......@@ -7,7 +7,7 @@
* Copyright (c) 2000-2006, PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.69 2006/07/13 18:01:02 momjian Exp $
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.70 2006/07/25 03:51:22 tgl Exp $
*--------------------------------------------------------------------
*/
#ifndef GUC_H
......@@ -116,7 +116,6 @@ extern bool log_statement_stats;
extern bool log_btree_build_stats;
extern bool SQL_inheritance;
extern bool Australian_timezones;
extern bool default_with_oids;
......@@ -220,9 +219,6 @@ extern void read_nondefault_variables(void);
* belong in.
*/
/* in utils/adt/datetime.c */
extern bool ClearDateCache(bool newval, bool doit, GucSource source);
/* in commands/tablespace.c */
extern const char *assign_default_tablespace(const char *newval,
bool doit, GucSource source);
......
/*-------------------------------------------------------------------------
*
* tzparser.h
* Timezone offset file parsing definitions.
*
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/utils/tzparser.h,v 1.1 2006/07/25 03:51:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef TZPARSER_H
#define TZPARSER_H
/*
* The result of parsing a timezone configuration file is an array of
* these structs, in order by abbrev. We export this because datetime.c
* needs it.
*/
typedef struct tzEntry
{
/* the actual data: TZ abbrev (downcased), offset, DST flag */
char *abbrev;
int offset; /* in seconds from UTC */
bool is_dst;
/* source information (for error messages) */
int lineno;
const char *filename;
} tzEntry;
extern bool load_tzoffsets(const char *filename, bool doit, int elevel);
#endif /* TZPARSER_H */
--
-- HOROLOGY
--
-- needed so tests pass even in Australia
SET australian_timezones = 'off';
SET DateStyle = 'Postgres, MDY';
--
-- Test various input formats
......
......@@ -1306,6 +1306,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
pg_statio_user_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit FROM pg_statio_all_tables WHERE (pg_statio_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'pg_toast'::name, 'information_schema'::name]));
pg_stats | SELECT n.nspname AS schemaname, c.relname AS tablename, a.attname, s.stanullfrac AS null_frac, s.stawidth AS avg_width, s.stadistinct AS n_distinct, CASE 1 WHEN s.stakind1 THEN s.stavalues1 WHEN s.stakind2 THEN s.stavalues2 WHEN s.stakind3 THEN s.stavalues3 WHEN s.stakind4 THEN s.stavalues4 ELSE NULL::"unknown" END AS most_common_vals, CASE 1 WHEN s.stakind1 THEN s.stanumbers1 WHEN s.stakind2 THEN s.stanumbers2 WHEN s.stakind3 THEN s.stanumbers3 WHEN s.stakind4 THEN s.stanumbers4 ELSE NULL::real[] END AS most_common_freqs, CASE 2 WHEN s.stakind1 THEN s.stavalues1 WHEN s.stakind2 THEN s.stavalues2 WHEN s.stakind3 THEN s.stavalues3 WHEN s.stakind4 THEN s.stavalues4 ELSE NULL::"unknown" END AS histogram_bounds, CASE 3 WHEN s.stakind1 THEN s.stanumbers1[1] WHEN s.stakind2 THEN s.stanumbers2[1] WHEN s.stakind3 THEN s.stanumbers3[1] WHEN s.stakind4 THEN s.stanumbers4[1] ELSE NULL::real END AS correlation FROM (((pg_statistic s JOIN pg_class c ON ((c.oid = s.starelid))) JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum)))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE has_table_privilege(c.oid, 'select'::text);
pg_tables | SELECT n.nspname AS schemaname, c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS "tablespace", c.relhasindex AS hasindexes, c.relhasrules AS hasrules, (c.reltriggers > 0) AS hastriggers FROM ((pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) WHERE (c.relkind = 'r'::"char");
pg_timezonenames | SELECT t.name, t.utc_offset, t.is_dst FROM pg_timezonenames() t(name text, utc_offset interval, is_dst boolean);
pg_user | SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usesuper, pg_shadow.usecatupd, '********'::text AS passwd, pg_shadow.valuntil, pg_shadow.useconfig FROM pg_shadow;
pg_views | SELECT n.nspname AS schemaname, c.relname AS viewname, pg_get_userbyid(c.relowner) AS viewowner, pg_get_viewdef(c.oid) AS definition FROM (pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'v'::"char");
rtest_v1 | SELECT rtest_t1.a, rtest_t1.b FROM rtest_t1;
......@@ -1322,7 +1323,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
shoelace_obsolete | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm FROM shoelace WHERE (NOT (EXISTS (SELECT shoe.shoename FROM shoe WHERE (shoe.slcolor = shoelace.sl_color))));
street | SELECT r.name, r.thepath, c.cname FROM ONLY road r, real_city c WHERE (c.outline ## r.thepath);
toyemp | SELECT emp.name, emp.age, emp."location", (12 * emp.salary) AS annualsal FROM emp;
(46 rows)
(47 rows)
SELECT tablename, rulename, definition FROM pg_rules
ORDER BY tablename, rulename;
......
--
-- TIMESTAMP
--
-- needed so tests pass even in Australia
SET australian_timezones = 'off';
CREATE TABLE TIMESTAMP_TBL ( d1 timestamp(2) without time zone);
-- Shorthand values
-- Not directly usable for regression testing since these are not constants.
......
--
-- TIMESTAMPTZ
--
-- needed so tests pass even in Australia
SET australian_timezones = 'off';
CREATE TABLE TIMESTAMPTZ_TBL ( d1 timestamp(2) with time zone);
INSERT INTO TIMESTAMPTZ_TBL VALUES ('now');
INSERT INTO TIMESTAMPTZ_TBL VALUES ('current');
......
......@@ -11,7 +11,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/test/regress/pg_regress.c,v 1.14 2006/07/25 01:37:42 adunstan Exp $
* $PostgreSQL: pgsql/src/test/regress/pg_regress.c,v 1.15 2006/07/25 03:51:22 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -1564,8 +1564,9 @@ main(int argc, char *argv[])
"ALTER DATABASE \"%s\" SET lc_messages TO 'C';"
"ALTER DATABASE \"%s\" SET lc_monetary TO 'C';"
"ALTER DATABASE \"%s\" SET lc_numeric TO 'C';"
"ALTER DATABASE \"%s\" SET lc_time TO 'C';",
dbname, dbname, dbname, dbname);
"ALTER DATABASE \"%s\" SET lc_time TO 'C';"
"ALTER DATABASE \"%s\" SET timezone_abbreviations TO 'Default';",
dbname, dbname, dbname, dbname, dbname);
/*
* Install any requested PL languages
......
--
-- HOROLOGY
--
-- needed so tests pass even in Australia
SET australian_timezones = 'off';
SET DateStyle = 'Postgres, MDY';
--
......
--
-- TIMESTAMP
--
-- needed so tests pass even in Australia
SET australian_timezones = 'off';
CREATE TABLE TIMESTAMP_TBL ( d1 timestamp(2) without time zone);
......
--
-- TIMESTAMPTZ
--
-- needed so tests pass even in Australia
SET australian_timezones = 'off';
CREATE TABLE TIMESTAMPTZ_TBL ( d1 timestamp(2) with time zone);
......
......@@ -4,7 +4,7 @@
# Makefile for the timezone library
# IDENTIFICATION
# $PostgreSQL: pgsql/src/timezone/Makefile,v 1.23 2005/12/09 21:19:36 petere Exp $
# $PostgreSQL: pgsql/src/timezone/Makefile,v 1.24 2006/07/25 03:51:22 tgl Exp $
#
#-------------------------------------------------------------------------
......@@ -35,12 +35,14 @@ zic: $(ZICOBJS)
install: all installdirs
./zic -d '$(DESTDIR)$(datadir)/timezone' $(TZDATAFILES)
$(MAKE) -C tznames $@
installdirs:
$(mkinstalldirs) '$(DESTDIR)$(datadir)'
uninstall:
rm -rf '$(DESTDIR)$(datadir)/timezone'
$(MAKE) -C tznames $@
clean distclean maintainer-clean:
rm -f SUBSYS.o zic$(X) $(OBJS) $(ZICOBJS)
......@@ -11,3 +11,9 @@ from
Since time zone rules change frequently in some parts of the world,
we should endeavor to update the data files before each PostgreSQL
release.
At each update, we should check if time zone offsets have changed.
Just search for the current or previous year and see what has changed.
Sometimes a country changes its time zone offsets, for example Georgia
in 2004. Just grepping in the zic database files for 2004 is enough to
spot such a change. Then the files under tznames/ should be updated.
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
CAT 7200 # Central Africa Time
# (Africa/Blantyre)
# (Africa/Bujumbura)
# (Africa/Gaborone)
# (Africa/Harare)
# (Africa/Kigali)
# (Africa/Lubumbashi)
# (Africa/Lusaka)
# (Africa/Maputo)
CEST 7200 D # Central Europe Summer Time
# (Africa/Ceuta)
# (Europe/Amsterdam)
# (Europe/Andorra)
# (Europe/Belgrade)
# (Europe/Berlin)
# (Europe/Brussels)
# (Europe/Budapest)
# (Europe/Copenhagen)
# (Europe/Gibraltar)
# (Europe/Luxembourg)
# (Europe/Madrid)
# (Europe/Malta)
# (Europe/Monaco)
# (Europe/Oslo)
# (Europe/Paris)
# (Europe/Prague)
# (Europe/Rome)
# (Europe/Stockholm)
# (Europe/Tirane)
# (Europe/Vaduz)
# (Europe/Vienna)
# (Europe/Warsaw)
# (Europe/Zurich)
CET 3600 # Central Europe Time
# (Africa/Algiers)
# (Africa/Ceuta)
# (Europe/Amsterdam)
# (Europe/Andorra)
# (Europe/Belgrade)
# (Europe/Berlin)
# (Europe/Brussels)
# (Europe/Budapest)
# (Europe/Copenhagen)
# (Europe/Gibraltar)
# (Europe/Luxembourg)
# (Europe/Madrid)
# (Europe/Malta)
# (Europe/Monaco)
# (Europe/Oslo)
# (Europe/Paris)
# (Europe/Prague)
# (Europe/Rome)
# (Europe/Stockholm)
# (Europe/Tirane)
# (Europe/Vaduz)
# (Europe/Vienna)
# (Europe/Warsaw)
# (Europe/Zurich)
EAT 10800 # East Africa Time
# (Africa/Addis_Ababa)
# (Africa/Asmera)
# (Africa/Dar_es_Salaam)
# (Africa/Djibouti)
# (Africa/Kampala)
# (Africa/Khartoum)
# (Africa/Mogadishu)
# (Africa/Nairobi)
# (Indian/Antananarivo)
# (Indian/Comoro)
# (Indian/Mayotte)
EEST 10800 D # East-Egypt Summer Time
# Eastern Europe Summer Time
# (Africa/Cairo)
# (Asia/Amman)
# (Asia/Beirut)
# (Asia/Damascus)
# (Asia/Gaza)
# (Asia/Nicosia)
# (Europe/Athens)
# (Europe/Bucharest)
# (Europe/Chisinau)
# (Europe/Helsinki)
# (Europe/Istanbul)
# (Europe/Kaliningrad)
# (Europe/Kiev)
# (Europe/Minsk)
# (Europe/Riga)
# (Europe/Simferopol)
# (Europe/Sofia)
# (Europe/Tallinn)
# (Europe/Uzhgorod)
# (Europe/Vilnius)
# (Europe/Zaporozhye)
EET 7200 # East-Egypt Time
# Eastern Europe Time
# (Africa/Cairo)
# (Africa/Tripoli)
# (Asia/Amman)
# (Asia/Beirut)
# (Asia/Damascus)
# (Asia/Gaza)
# (Asia/Nicosia)
# (Europe/Athens)
# (Europe/Bucharest)
# (Europe/Chisinau)
# (Europe/Helsinki)
# (Europe/Istanbul)
# (Europe/Kaliningrad)
# (Europe/Kiev)
# (Europe/Minsk)
# (Europe/Riga)
# (Europe/Simferopol)
# (Europe/Sofia)
# (Europe/Tallinn)
# (Europe/Uzhgorod)
# (Europe/Vilnius)
# (Europe/Zaporozhye)
GMT 0 # Greenwich Mean Time
# (Africa/Abidjan)
# (Africa/Bamako)
# (Africa/Banjul)
# (Africa/Bissau)
# (Africa/Conakry)
# (Africa/Dakar)
# (Africa/Lome)
# (Africa/Monrovia)
# (Africa/Nouakchott)
# (Africa/Ouagadougou)
# (Africa/Sao_Tome)
# (America/Danmarkshavn)
# (Atlantic/Reykjavik)
# (Atlantic/St_Helena)
# (Etc/GMT)
# (Europe/Dublin)
# (Europe/London)
SAST 7200 # South Africa Standard Time
# Australian South Standard Time
# (Africa/Maseru)
# (Africa/Mbabane)
WAST 7200 D # West Africa Summer Time
# (Africa/Windhoek)
WAT 3600 # West Africa Time
# (Africa/Bangui)
# (Africa/Brazzaville)
# (Africa/Douala)
# (Africa/Kinshasa)
# (Africa/Lagos)
# (Africa/Libreville)
# (Africa/Luanda)
# (Africa/Malabo)
# (Africa/Ndjamena)
# (Africa/Niamey)
# (Africa/Porto-Novo)
# (Africa/Windhoek)
WET 0 # Western Europe Time
# (Africa/Casablanca)
# (Africa/El_Aaiun)
# (Atlantic/Canary)
# (Atlantic/Faeroe)
# (Atlantic/Madeira)
# (Europe/Lisbon)
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
# Acre time is sometimes called Acre Standard Time (AST) which leads to a
# conflict with AST (see below at AST)
ACT -18000 # Acre Time
# (America/Eirunepe)
# (America/Rio_Branco)
# CONFLICT! ACST is not unique
# Other timezones:
# - ACST: Central Australia Standard Time (Australia)
ACST -14400 D # Acre Summer Time (not in zic)
# (America/Eirunepe)
# (America/Rio_Branco)
# CONFLICT! ADT is not unique
# Other timezones:
# - ADT: Arabic Daylight Time (Asia)
ADT -10800 D # Atlantic Daylight Time
# (America/Glace_Bay)
# (America/Goose_Bay)
# (America/Halifax)
# (America/Thule)
# (Atlantic/Bermuda)
AKDT -28800 D # Alaska Daylight Time
# (America/Anchorage)
# (America/Juneau)
# (America/Nome)
# (America/Yakutat)
AKST -32400 # Alaska Standard Time
# (America/Anchorage)
# (America/Juneau)
# (America/Nome)
# (America/Yakutat)
# CONFLICT! AMST is not unique
# Other timezones:
# - AMST: Armenia Summer Time (Asia)
AMST -10800 D # Amazon Summer Time
# (America/Campo_Grande)
# (America/Cuiaba)
# CONFLICT! AMT is not unique
# Other timezones:
# - AMT: Armenia Time (Asia)
AMT -14400 # Amazon Time
# (America/Boa_Vista)
# (America/Campo_Grande)
# (America/Cuiaba)
# (America/Manaus)
# (America/Porto_Velho)
ART -10800 # Argentina Time (not in zic)
# CONFLICT! AST is not unique
# Other timezones:
# - AST: Arabic Standard Time (Asia)
# - AST: Al Manamah Standard Time (Asia) same offset as Arabia Standard Time
# - AST/ACT: Acre Standard Time (America) listed as ACT
# - AST: Anguilla Standard Time (America) same offset
# - AST: Antigua Standard Time (America) same offset
# - AST: Antilles Standard Time (America) same offset
AST -14400 # Atlantic Standard Time
# (America/Anguilla)
# (America/Antigua)
# (America/Aruba)
# (America/Curacao)
# (America/Dominica)
# (America/Glace_Bay)
# (America/Goose_Bay)
# (America/Grenada)
# (America/Guadeloupe)
# (America/Halifax)
# (America/Martinique)
# (America/Montserrat)
# (America/Port_of_Spain)
# (America/Puerto_Rico)
# (America/Santo_Domingo)
# (America/St_Kitts)
# (America/St_Lucia)
# (America/St_Thomas)
# (America/St_Vincent)
# (America/Thule)
# (America/Tortola)
# (Atlantic/Bermuda)
BOT -14400 # Bolivia Time
# (America/La_Paz)
BRA -10800 # Brazil Time (not in zic)
BRST -7200 D # Brasil Summer Time
# (America/Sao_Paulo)
BRT -10800 # Brasil Time
# (America/Araguaina)
# (America/Bahia)
# (America/Belem)
# (America/Fortaleza)
# (America/Maceio)
# (America/Recife)
# (America/Sao_Paulo)
# CONFLICT! CDT is not unique
# Other timezones:
# - CDT: Central Daylight Time (America)
# - CDT: Mexico Central Daylight Time (America)
# - CDT: Canada Central Daylight Time (America)
CDT -14400 D # Cuba Central Daylight Time
# (America/Havana)
# CONFLICT! CDT is not unique
# Other timezones:
# - CDT: Mexico Central Daylight Time (America)
# - CDT: Cuba Central Daylight Time (America)
# - CDT: Canada Central Daylight Time (America)
CDT -18000 D # Central Daylight Time
# (America/Cancun)
# (America/Chicago)
# (America/Menominee)
# (America/Merida)
# (America/Mexico_City)
# (America/Monterrey)
# (America/North_Dakota/Center)
# (America/Rainy_River)
# (America/Rankin_Inlet)
# (America/Winnipeg)
CLST -10800 D # Chile Summer Time
# (America/Santiago)
# (Antarctica/Palmer)
CLT -14400 # Chile Time
# (America/Santiago)
# (Antarctica/Palmer)
COT -18000 # Columbia Time (not in zic)
# CONFLICT! CST is not unique
# Other timezones:
# - CST: Central Standard Time (Australia)
# - CST: Central Standard Time (America)
CST -18000 # Cuba Central Standard Time (America)
# (America/Havana)
# CONFLICT! CST is not unique
# Other timezones:
# - CST: Central Standard Time (Australia)
# - CST: Cuba Central Standard Time (America)
CST -21600 # Central Standard Time (America)
# (America/Cancun)
# (America/Chicago)
# (America/Menominee)
# (America/Merida)
# (America/Mexico_City)
# (America/Monterrey)
# (America/North_Dakota/Center)
# (America/Rainy_River)
# (America/Rankin_Inlet)
# (America/Regina)
# (America/Swift_Current)
# (America/Winnipeg)
ECT -18000 # Ecuador Time
# Eastern Caribbean Time
# (America/Guayaquil)
EDT -14400 D # Eastern Daylight Saving Time
# (America/Detroit)
# (America/Grand_Turk)
# (America/Indiana/Indianapolis)
# (America/Indiana/Knox)
# (America/Indiana/Marengo)
# (America/Indiana/Vevay)
# (America/Iqaluit)
# (America/Kentucky/Louisville)
# (America/Kentucky/Monticello)
# (America/Montreal)
# (America/Nassau)
# (America/New_York)
# (America/Nipigon)
# (America/Pangnirtung)
# (America/Thunder_Bay)
# (America/Toronto)
EGST 0 D # East Greenland Summer Time
# (America/Scoresbysund)
EGT -3600 # East Greenland Time (Svalbard & Jan Mayen)
# (America/Scoresbysund)
# CONFLICT! EST is not unique
# Other timezones:
# - EST: Eastern Standard Time (Australia)
EST -18000 # Eastern Standard Time (America)
# (America/Cayman)
# (America/Coral_Harbour)
# (America/Detroit)
# (America/Grand_Turk)
# (America/Indiana/Indianapolis)
# (America/Indiana/Knox)
# (America/Indiana/Marengo)
# (America/Indiana/Vevay)
# (America/Iqaluit)
# (America/Jamaica)
# (America/Kentucky/Louisville)
# (America/Kentucky/Monticello)
# (America/Montreal)
# (America/Nassau)
# (America/New_York)
# (America/Nipigon)
# (America/Panama)
# (America/Pangnirtung)
# (America/Thunder_Bay)
# (America/Toronto)
FNT -7200 # Fernando de Noronha Time
# (America/Noronha)
FNST -3600 D # Fernando de Noronha Summer Time (not in zic)
# (America/Noronha)
GFT -10800 # French Guiana Time
# (America/Cayenne)
GMT 0 # Greenwich Mean Time
# (Africa/Abidjan)
# (Africa/Bamako)
# (Africa/Banjul)
# (Africa/Bissau)
# (Africa/Conakry)
# (Africa/Dakar)
# (Africa/Lome)
# (Africa/Monrovia)
# (Africa/Nouakchott)
# (Africa/Ouagadougou)
# (Africa/Sao_Tome)
# (America/Danmarkshavn)
# (Atlantic/Reykjavik)
# (Atlantic/St_Helena)
# (Etc/GMT)
# (Europe/Dublin)
# (Europe/London)
GYT -14400 # Guyana Time
# (America/Guyana)
HADT -32400 D # Hawaii-Aleutain Daylight Time
# (America/Adak)
HAST -36000 # Hawaii-Aleutain Standard Time
# (America/Adak)
MDT -21600 D # Mexico Mountain Daylight Time
# Mountain Daylight Time
# (America/Boise)
# (America/Cambridge_Bay)
# (America/Chihuahua)
# (America/Denver)
# (America/Edmonton)
# (America/Inuvik)
# (America/Mazatlan)
# (America/Yellowknife)
MST -25200 # Mexico Mountain Standard Time
# Mountain Standard Time
# (America/Boise)
# (America/Cambridge_Bay)
# (America/Chihuahua)
# (America/Dawson_Creek)
# (America/Denver)
# (America/Edmonton)
# (America/Hermosillo)
# (America/Inuvik)
# (America/Mazatlan)
# (America/Phoenix)
# (America/Yellowknife)
NDT -9000 D # Newfoundland Daylight Time
# (America/St_Johns)
# CONFLICT! NFT is not unique
# Other timezones:
# - NFT: Norfolk Time (Pacific)
NFT -12600 # Newfoundland Time (not in zic)
NST -12600 # Newfoundland Standard Time
# (America/St_Johns)
PDT -25200 D # Pacific Daylight Time
# (America/Dawson)
# (America/Los_Angeles)
# (America/Tijuana)
# (America/Vancouver)
# (America/Whitehorse)
PET -18000 # Peru Time (not in zic)
PMDT -7200 D # Pierre & Miquelon Daylight Time
# (America/Miquelon)
PMST -10800 # Pierre & Miquelon Standard Time
# (America/Miquelon)
PST -28800 # Pacific Standard Time
# (America/Dawson)
# (America/Los_Angeles)
# (America/Tijuana)
# (America/Vancouver)
# (America/Whitehorse)
# (Pacific/Pitcairn)
PYST -10800 D # Paraguay Summer Time
# (America/Asuncion)
PYT -14400 # Paraguay Time
# (America/Asuncion)
SRT -10800 # Suriname Time
# (America/Paramaribo)
UYST -7200 D # Uruguay Summer Time (not in zic)
UYT -10800 # Uruguay Time (not in zic)
VET -14400 # Venezuela Time
# (America/Caracas)
WGST -7200 D # Western Greenland Summer Time
# (America/Godthab)
WGT -10800 # West Greenland Time
# (America/Godthab)
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
CLST -10800 D # Chile Summer Time
# (America/Santiago)
# (Antarctica/Palmer)
CLT -14400 # Chile Time
# (America/Santiago)
# (Antarctica/Palmer)
DAVT 25200 # Davis Time (Antarctica)
# (Antarctica/Davis)
DDUT 36000 # Dumont-d`Urville Time (Antarctica)
# (Antarctica/DumontDUrville)
MAWT 21600 # Mawson Time (Antarctica)
# (Antarctica/Mawson)
NZDT 46800 D # New Zealand Daylight Time
# (Antarctica/McMurdo)
# (Pacific/Auckland)
NZST 43200 # New Zealand Standard Time
# (Antarctica/McMurdo)
# (Pacific/Auckland)
ROTT -10800 # Rothera Time
# (Antarctica/Rothera)
SYOT 10800 # Syowa Time
# (Antarctica/Syowa)
VOST 21600 # Vostok time
# (Antarctica/Vostok)
# CONFLICT! WST is not unique
# Other timezones:
# - WST: West Samoa Time
WST 28800 # Western Standard Time (Australia)
# (Antarctica/Casey)
# (Australia/Perth)
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
# CONFLICT! ADT is not unique
# Other timezones:
# - ADT: Atlantic Daylight Time (America)
ADT 14400 D # Arabia Daylight Time
# (Asia/Baghdad)
AFT 16200 # Afghanistan Time
# (Asia/Kabul)
ALMST 25200 D # Alma-Ata Summer Time
# (Asia/Almaty)
ALMT 21600 # Alma-Ata Time
# (Asia/Almaty)
# CONFLICT! AMST is not unique
# Other timezones:
# - AMST: Amazon Summer Time (America)
AMST 18000 D # Armenia Summer Time
# (Asia/Yerevan)
# CONFLICT! AMT is not unique
# Other timezones:
# - AMT: Amazon Time (America)
AMT 14400 # Armenia Time
# (Asia/Yerevan)
ANAST 46800 D # Anadyr Summer Time
# (Asia/Anadyr)
ANAT 43200 # Anadyr Time
# (Asia/Anadyr)
AQTT 18000 # Aqtau Time
# Aqtobe Time
# (Asia/Aqtau)
# (Asia/Aqtobe)
# CONFLICT! AST is not unique
# Other timezones:
# - AST: Atlantic Standard Time (America)
# - AST/ACT: Acre Standard Time (America) listed as ACT
# - AST: Anguilla Standard Time (America) same offset as Atlantic Standard Time
# - AST: Antigua Standard Time (America) same offset as Atlantic Standard Time
# - AST: Antilles Standard Time (America) same offset as Atlantic Standard Time
# - AST: Al Manamah Standard Time (Asia) same offset as Arabia Standard Time
AST 10800 # Arabia Standard Time
# (Asia/Aden)
# (Asia/Baghdad)
# (Asia/Bahrain)
# (Asia/Kuwait)
# (Asia/Qatar)
# (Asia/Riyadh)
AZST 18000 D # Azerbaijan Summer Time
# (Asia/Baku)
AZT 14400 # Azerbaijan Time
# (Asia/Baku)
BDT 21600 # Bangladesh Time
# (Asia/Dhaka)
BNT 28800 # Brunei Darussalam Time
# (Asia/Brunei)
BORT 28800 # Borneo Time (Indonesia) (not in zic)
BTT 21600 # Bhutan Time
# (Asia/Thimphu)
CCT 28800 # China Coastal Time (not in zic)
CHOST 36000 D # Choibalsan Summer Time
# (Asia/Choibalsan)
CHOT 32400 # Choibalsan Time
# (Asia/Choibalsan)
CIT 28800 # Central Indonesia Time
# (Asia/Makassar)
EEST 10800 D # East-Egypt Summer Time
# Eastern Europe Summer Time
# (Africa/Cairo)
# (Asia/Amman)
# (Asia/Beirut)
# (Asia/Damascus)
# (Asia/Gaza)
# (Asia/Nicosia)
# (Europe/Athens)
# (Europe/Bucharest)
# (Europe/Chisinau)
# (Europe/Helsinki)
# (Europe/Istanbul)
# (Europe/Kaliningrad)
# (Europe/Kiev)
# (Europe/Minsk)
# (Europe/Riga)
# (Europe/Simferopol)
# (Europe/Sofia)
# (Europe/Tallinn)
# (Europe/Uzhgorod)
# (Europe/Vilnius)
# (Europe/Zaporozhye)
EET 7200 # East-Egypt Time
# Eastern Europe Time
# (Africa/Cairo)
# (Africa/Tripoli)
# (Asia/Amman)
# (Asia/Beirut)
# (Asia/Damascus)
# (Asia/Gaza)
# (Asia/Nicosia)
# (Europe/Athens)
# (Europe/Bucharest)
# (Europe/Chisinau)
# (Europe/Helsinki)
# (Europe/Istanbul)
# (Europe/Kaliningrad)
# (Europe/Kiev)
# (Europe/Minsk)
# (Europe/Riga)
# (Europe/Simferopol)
# (Europe/Sofia)
# (Europe/Tallinn)
# (Europe/Uzhgorod)
# (Europe/Vilnius)
# (Europe/Zaporozhye)
EIT 32400 # East Indonesia Time
# (Asia/Jayapura)
GEST 14400 D # Georgia Summer Time (there was a timezone change in 2004)
# (Asia/Tbilisi)
GET 10800 # Georgia Time (there was a timezone change in 2004)
# (Asia/Tbilisi)
# CONFLICT! GST is not unique
# Other timezones:
# - GST: South Georgia Time (Atlantic)
GST 14400 # Gulf Standard Time
# (Asia/Dubai)
# (Asia/Muscat)
HKT 28800 # Hong Kong Time (not in zic)
HOVST 28800 D # Hovd Summer Time
# (Asia/Hovd)
HOVT 25200 # Hovd Time
# (Asia/Hovd)
ICT 25200 # Indochina Time
# (Asia/Bangkok)
# (Asia/Phnom_Penh)
# (Asia/Saigon)
# (Asia/Vientiane)
IRKST 32400 D # Irkutsk Summer Time
# (Asia/Irkutsk)
IRKT 28800 # Irkutsk Time
# (Asia/Irkutsk)
IRT 12600 # Iran Time (not in zic)
# CONFLICT! IST is not unique
# Other timezones:
# - IST: Irish Summer Time (Europe)
# - IST: Israel Standard Time (Asia)
IST 19800 # Indian Standard Time
# (Asia/Calcutta)
# CONFLICT! IST is not unique
# Other timezones:
# - IST: Irish Summer Time (Europe)
# - IST: Indian Standard Time (Asia)
IST 7200 # Israel Standard Time
# (this time zone is not contained in the ZIC database)
JAYT 32400 # Jayapura Time (Indonesia) (not in zic)
KDT 36000 D # Korean Daylight Time (not in zic)
KGST 21600 D # Kyrgyzstan Summer Time
# (Asia/Bishkek)
KGT 18000 # Kyrgyzstan Time
# (Asia/Bishkek)
KRAST 28800 D # Krasnoyarsk Summer Time
# (Asia/Krasnoyarsk)
KRAT 25200 # Krasnoyarsk Time
# (Asia/Krasnoyarsk)
KST 32400 # Korean Standard Time
# (Asia/Pyongyang)
LKT 21600 # Lanka Time
# (Asia/Colombo)
MAGST 43200 D # Magadan Summer Time
# (Asia/Magadan)
MAGT 39600 # Magadan Time
# (Asia/Magadan)
MMT 23400 # Myanmar Time
# (Asia/Rangoon)
MYT 28800 # Malaysia Time
# (Asia/Kuala_Lumpur)
# (Asia/Kuching)
NOVST 25200 D # Novosibirsk Summer Time
# (Asia/Novosibirsk)
NOVT 21600 # Novosibirsk Time
# (Asia/Novosibirsk)
NPT 20700 # Nepal Time
# (Asia/Katmandu)
OMSST 25200 D # Omsk Summer Time
# (Asia/Omsk)
OMST 21600 # Omsk Time
# (Asia/Omsk)
ORAT 18000 # Oral Time
# (Asia/Oral)
PETST 46800 D # Petropavlovsk-Kamchatski Summer Time
# (Asia/Kamchatka)
PETT 43200 # Petropavlovsk-Kamchatski Time
# (Asia/Kamchatka)
PHT 28800 # Phillipine Time (not in zic)
PKT 18000 # Pakistan Time (not in zic)
QYZT 21600 # Kizilorda Time
# (Asia/Qyzylorda)
SAKST 39600 D # Sakhalin Summer Time
# (Asia/Sakhalin)
SAKT 36000 # Sakhalin Time
# (Asia/Sakhalin)
SGT 28800 # Singapore Time
# (Asia/Singapore)
TJT 18000 # Tajikistan Time
# (Asia/Dushanbe)
TLT 32400 # East Timor Time
# (Asia/Dili)
TMT 18000 # Turkmenistan Time
# (Asia/Ashgabat)
ULAST 32400 D # Ulan Bator Summer Time
# (Asia/Ulaanbaatar)
ULAT 28800 # Ulan Bator Time
# (Asia/Ulaanbaatar)
UZST 21600 D # Uzbekistan Summer Time
# (Asia/Samarkand)
# (Asia/Tashkent)
UZT 18000 # Uzbekistan Time
# (Asia/Samarkand)
# (Asia/Tashkent)
VLAST 39600 D # Vladivostok Summer Time
# (Asia/Vladivostok)
VLAT 36000 # Vladivostok Time
# (Asia/Vladivostok)
WIT 25200 # Waktu Indonesia Timur
# West Indonesia Time
# (Asia/Jakarta)
# (Asia/Pontianak)
YAKST 36000 D # Yakutsk Summer Time
# (Asia/Yakutsk)
YAKT 32400 # Yakutsk Time
# (Asia/Yakutsk)
YEKST 21600 D # Yekaterinburg Summer Time
# (Asia/Yekaterinburg)
YEKT 18000 # Yekaterinburg Time
# (Asia/Yekaterinburg)
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
# CONFLICT! ADT is not unique
# Other timezones:
# - ADT: Arabic Daylight Time (Asia)
ADT -10800 D # Atlantic Daylight Time
# (America/Glace_Bay)
# (America/Goose_Bay)
# (America/Halifax)
# (America/Thule)
# (Atlantic/Bermuda)
# CONFLICT! AST is not unique
# Other timezones:
# - AST: Arabic Standard Time (Asia)
# - AST: Al Manamah Standard Time (Asia) same offset as Arabia Standard Time
# - AST/ACT: Acre Standard Time (America) listed as ACT
# - AST: Anguilla Standard Time (America) same offset
# - AST: Antigua Standard Time (America) same offset
# - AST: Antilles Standard Time (America) same offset
AST -14400 # Atlantic Standard Time
# (America/Anguilla)
# (America/Antigua)
# (America/Aruba)
# (America/Curacao)
# (America/Dominica)
# (America/Glace_Bay)
# (America/Goose_Bay)
# (America/Grenada)
# (America/Guadeloupe)
# (America/Halifax)
# (America/Martinique)
# (America/Montserrat)
# (America/Port_of_Spain)
# (America/Puerto_Rico)
# (America/Santo_Domingo)
# (America/St_Kitts)
# (America/St_Lucia)
# (America/St_Thomas)
# (America/St_Vincent)
# (America/Thule)
# (America/Tortola)
# (Atlantic/Bermuda)
AZOST 0 D # Azores Summer Time
# (Atlantic/Azores)
AZOT -3600 # Azores Time
# (Atlantic/Azores)
CVT -3600 # Cape Verde Time
# (Atlantic/Cape_Verde)
FKST -10800 D # Falkland Islands Summer Time
# (Atlantic/Stanley)
FKT -14400 # Falkland Islands Time
# (Atlantic/Stanley)
GMT 0 # Greenwich Mean Time
# (Africa/Abidjan)
# (Africa/Bamako)
# (Africa/Banjul)
# (Africa/Bissau)
# (Africa/Conakry)
# (Africa/Dakar)
# (Africa/Lome)
# (Africa/Monrovia)
# (Africa/Nouakchott)
# (Africa/Ouagadougou)
# (Africa/Sao_Tome)
# (America/Danmarkshavn)
# (Atlantic/Reykjavik)
# (Atlantic/St_Helena)
# (Etc/GMT)
# (Europe/Dublin)
# (Europe/London)
# CONFLICT! GST is not unique
# Other timezones:
# - GST: Gulf Standard Time (Asia)
GST -7200 # South Georgia Time (Atlantic)
# (Atlantic/South_Georgia)
WEST 3600 D # Western Europe Summer Time
# (Atlantic/Canary)
# (Atlantic/Faeroe)
# (Atlantic/Madeira)
# (Europe/Lisbon)
WET 0 # Western Europe Time
# (Africa/Casablanca)
# (Africa/El_Aaiun)
# (Atlantic/Canary)
# (Atlantic/Faeroe)
# (Atlantic/Madeira)
# (Europe/Lisbon)
# Time zone configuration file for set "Australia"
# In order to use this file, you need to set the run-time parameter
# timezone_abbreviations to 'Australia'. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
# include the default set
@INCLUDE Default
# most timezones are already defined in the default set. With the OVERRIDE
# option, PostgreSQL will use the new definitions instead of throwing an error
# in case of a conflict.
@OVERRIDE
ACST 34200 # Central Australia Standard Time (not in zic)
CST 34200 # Central Standard Time (Australia)
# (Australia/Adelaide)
# (Australia/Broken_Hill)
EAST 36000 # East Australian Standard Time (Australia) (not in zic)
EST 36000 # Eastern Standard Time (Australia)
# (Australia/Currie)
# (Australia/Hobart)
# (Australia/Melbourne)
# (Australia/Sydney)
# (Australia/Currie)
# (Australia/Hobart)
# (Australia/Melbourne)
# (Australia/Sydney)
SAT 34200 # South Australian Standard Time (not in zic)
WST 28800 # Western Standard Time (Australia)
# (Antarctica/Casey)
# (Australia/Perth)
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
ACSST 37800 D # Central Australia (not in zic)
# CONFLICT! ACST is not unique
# Other timezones:
# - ACST: Acre Summer Time (America)
ACST 34200 # Central Australia Standard Time (not in zic)
AESST 39600 D # Australia Eastern Summer Standard Time (not in zic)
AEST 36000 # Australia Eastern Standard Time (not in zic)
AWSST 32400 D # Australia Western Summer Standard Time (not in zic)
AWST 28800 # Australia Western Standard Time (not in zic)
CADT 37800 D # Central Australia Daylight-Saving Time (not in zic)
CAST 34200 # Central Australia Standard Time (not in zic)
# CONFLICT! CST is not unique
# Other timezones:
# - CST: Central Standard Time (America)
# - CST: Cuba Central Standard Time (America)
CST 34200 # Central Standard Time (Australia)
# (Australia/Adelaide)
# (Australia/Broken_Hill)
# CONFLICT! EAST is not unique
# Other timezones:
# - EAST: Easter Island Time (Chile) (Pacific)
EAST 36000 # East Australian Standard Time (not in zic)
# CONFLICT! EST is not unique
# Other timezones:
# - EST: Eastern Standard Time (America)
EST 36000 # Eastern Standard Time (Australia)
# (Australia/Currie)
# (Australia/Hobart)
# (Australia/Melbourne)
# (Australia/Sydney)
# (Australia/Currie)
# (Australia/Hobart)
# (Australia/Melbourne)
# (Australia/Sydney)
LHDT 39600 D # Lord Howe Daylight Time, Australia (not in zic)
LHST 37800 # Lord Howe Standard Time (Australia)
# (Australia/Lord_Howe)
LIGT 36000 # Melbourne, Australia (not in zic)
NZT 43200 # New Zealand Time (not in zic)
SADT 37800 D # South Australian Daylight-Saving Time (not in zic)
SAST 34200 # South Australian Standard Time (not in zic)
SAT 34200 # South Australian Standard Time (not in zic)
WADT 28800 D # West Australian Daylight-Saving Time (not in zic)
WAST 25200 # West Australian Standard Time (not in zic)
WDT 32400 D # West Australian Daylight-Saving Time (not in zic)
# CONFLICT! WST is not unique
# Other timezones:
# - WST: West Samoa Time
WST 28800 # Western Standard Time (Australia)
# (Antarctica/Casey)
# (Australia/Perth)
此差异已折叠。
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
GMT 0 # Greenwich Mean Time
# (Africa/Abidjan)
# (Africa/Bamako)
# (Africa/Banjul)
# (Africa/Bissau)
# (Africa/Conakry)
# (Africa/Dakar)
# (Africa/Lome)
# (Africa/Monrovia)
# (Africa/Nouakchott)
# (Africa/Ouagadougou)
# (Africa/Sao_Tome)
# (America/Danmarkshavn)
# (Atlantic/Reykjavik)
# (Atlantic/St_Helena)
# (Etc/GMT)
# (Europe/Dublin)
# (Europe/London)
UCT 0 # Universal Coordinated Time
# (Etc/UCT)
UT 0 # Universal Time (not in zic)
UTC 0 # Coordinated Universal Time
# (Etc/UTC)
Z 0 # Zulu
ZULU 0 # Zulu
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
BST 3600 D # British Summer Time
# Brazil Standard Time
# Bering Summer Time
# (Europe/London)
CEST 7200 D # Central Europe Summer Time
# (Africa/Ceuta)
# (Europe/Amsterdam)
# (Europe/Andorra)
# (Europe/Belgrade)
# (Europe/Berlin)
# (Europe/Brussels)
# (Europe/Budapest)
# (Europe/Copenhagen)
# (Europe/Gibraltar)
# (Europe/Luxembourg)
# (Europe/Madrid)
# (Europe/Malta)
# (Europe/Monaco)
# (Europe/Oslo)
# (Europe/Paris)
# (Europe/Prague)
# (Europe/Rome)
# (Europe/Stockholm)
# (Europe/Tirane)
# (Europe/Vaduz)
# (Europe/Vienna)
# (Europe/Warsaw)
# (Europe/Zurich)
CET 3600 # Central Europe Time
# (Africa/Algiers)
# (Africa/Ceuta)
# (Europe/Amsterdam)
# (Europe/Andorra)
# (Europe/Belgrade)
# (Europe/Berlin)
# (Europe/Brussels)
# (Europe/Budapest)
# (Europe/Copenhagen)
# (Europe/Gibraltar)
# (Europe/Luxembourg)
# (Europe/Madrid)
# (Europe/Malta)
# (Europe/Monaco)
# (Europe/Oslo)
# (Europe/Paris)
# (Europe/Prague)
# (Europe/Rome)
# (Europe/Stockholm)
# (Europe/Tirane)
# (Europe/Vaduz)
# (Europe/Vienna)
# (Europe/Warsaw)
# (Europe/Zurich)
CETDST 7200 D # Central Europe Summer Time
# (Africa/Ceuta)
# (Europe/Amsterdam)
# (Europe/Andorra)
# (Europe/Belgrade)
# (Europe/Berlin)
# (Europe/Brussels)
# (Europe/Budapest)
# (Europe/Copenhagen)
# (Europe/Gibraltar)
# (Europe/Luxembourg)
# (Europe/Madrid)
# (Europe/Malta)
# (Europe/Monaco)
# (Europe/Oslo)
# (Europe/Paris)
# (Europe/Prague)
# (Europe/Rome)
# (Europe/Stockholm)
# (Europe/Tirane)
# (Europe/Vaduz)
# (Europe/Vienna)
# (Europe/Warsaw)
# (Europe/Zurich)
EEST 10800 D # East-Egypt Summertime
# Eastern Europe Summer Time
# (Africa/Cairo)
# (Asia/Amman)
# (Asia/Beirut)
# (Asia/Damascus)
# (Asia/Gaza)
# (Asia/Nicosia)
# (Europe/Athens)
# (Europe/Bucharest)
# (Europe/Chisinau)
# (Europe/Helsinki)
# (Europe/Istanbul)
# (Europe/Kaliningrad)
# (Europe/Kiev)
# (Europe/Minsk)
# (Europe/Riga)
# (Europe/Simferopol)
# (Europe/Sofia)
# (Europe/Tallinn)
# (Europe/Uzhgorod)
# (Europe/Vilnius)
# (Europe/Zaporozhye)
EET 7200 # East-Egypt Time
# Eastern Europe Time
# (Africa/Cairo)
# (Africa/Tripoli)
# (Asia/Amman)
# (Asia/Beirut)
# (Asia/Damascus)
# (Asia/Gaza)
# (Asia/Nicosia)
# (Europe/Athens)
# (Europe/Bucharest)
# (Europe/Chisinau)
# (Europe/Helsinki)
# (Europe/Istanbul)
# (Europe/Kaliningrad)
# (Europe/Kiev)
# (Europe/Minsk)
# (Europe/Riga)
# (Europe/Simferopol)
# (Europe/Sofia)
# (Europe/Tallinn)
# (Europe/Uzhgorod)
# (Europe/Vilnius)
# (Europe/Zaporozhye)
EETDST 10800 D # East-Egypt Summertime
# Eastern Europe Summer Time
# (Africa/Cairo)
# (Asia/Amman)
# (Asia/Beirut)
# (Asia/Damascus)
# (Asia/Gaza)
# (Asia/Nicosia)
# (Europe/Athens)
# (Europe/Bucharest)
# (Europe/Chisinau)
# (Europe/Helsinki)
# (Europe/Istanbul)
# (Europe/Kaliningrad)
# (Europe/Kiev)
# (Europe/Minsk)
# (Europe/Riga)
# (Europe/Simferopol)
# (Europe/Sofia)
# (Europe/Tallinn)
# (Europe/Uzhgorod)
# (Europe/Vilnius)
# (Europe/Zaporozhye)
GMT 0 # Greenwich Mean Time
# (Africa/Abidjan)
# (Africa/Bamako)
# (Africa/Banjul)
# (Africa/Bissau)
# (Africa/Conakry)
# (Africa/Dakar)
# (Africa/Lome)
# (Africa/Monrovia)
# (Africa/Nouakchott)
# (Africa/Ouagadougou)
# (Africa/Sao_Tome)
# (America/Danmarkshavn)
# (Atlantic/Reykjavik)
# (Atlantic/St_Helena)
# (Etc/GMT)
# (Europe/Dublin)
# (Europe/London)
# CONFLICT! IST is not unique
# Other timezones:
# - IST: Indian Standard Time (Asia)
# - IST: Israel Standard Time (Asia)
IST 3600 D # Irish Summer Time
# (Europe/Dublin)
MEST 7200 D # Middle Europe Summer Time (not in zic)
MET 3600 # Middle Europe Time (not in zic)
METDST 7200 D # Middle Europe Summer Time (not in zic)
MEZ 3600 # Mitteleuropische Zeit (German) (not in zic)
MSD 14400 D # Moscow Daylight Time
# (Europe/Moscow)
MSK 10800 # Moscow Time
# (Europe/Moscow)
SAMST 18000 D # Samara Summer Time
# (Europe/Samara)
SAMT 14400 # Samara Time
# (Europe/Samara)
WEST 3600 D # Western Europe Summer Time
# (Atlantic/Canary)
# (Atlantic/Faeroe)
# (Atlantic/Madeira)
# (Europe/Lisbon)
WET 0 # Western Europe Time
# (Africa/Casablanca)
# (Africa/El_Aaiun)
# (Atlantic/Canary)
# (Atlantic/Faeroe)
# (Atlantic/Madeira)
# (Europe/Lisbon)
WETDST 3600 D # Western Europe Summer Time
# (Atlantic/Canary)
# (Atlantic/Faeroe)
# (Atlantic/Madeira)
# (Europe/Lisbon)
# Time zone configuration file for set "India"
# In order to use this file, you need to set the run-time parameter
# timezone_abbreviations to 'India'. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
# include the default set
@INCLUDE Default
IST 19800 # Indian Standard Time
# (Asia/Calcutta)
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
CCT 23400 # Cocos Islands Time (Indian Ocean)
# (Indian/Cocos)
CXT 25200 # Christmas Island Time (Indian Ocean)
# (Indian/Christmas)
EAT 10800 # East Africa Time
# (Africa/Addis_Ababa)
# (Africa/Asmera)
# (Africa/Dar_es_Salaam)
# (Africa/Djibouti)
# (Africa/Kampala)
# (Africa/Khartoum)
# (Africa/Mogadishu)
# (Africa/Nairobi)
# (Indian/Antananarivo)
# (Indian/Comoro)
# (Indian/Mayotte)
IOT 21600 # British Indian Ocean Territory (Chagos) (there was a timezone change recently in 1996)
# (Indian/Chagos)
MUT 14400 # Mauritius Island Time
# (Indian/Mauritius)
MVT 18000 # Maldives Island Time
# (Indian/Maldives)
RET 14400 # Reunion Time
# (Indian/Reunion)
SCT 14400 # Seychelles Time
# (Indian/Mahe)
TFT 18000 # Kerguelen Time
# (Indian/Kerguelen)
#-------------------------------------------------------------------------
#
# Makefile
# Makefile for the timezone names
# IDENTIFICATION
# $PostgreSQL: pgsql/src/timezone/tznames/Makefile,v 1.1 2006/07/25 03:51:23 tgl Exp $
#
#-------------------------------------------------------------------------
subdir = src/timezone/tznames
top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
TZNAMES_TEMPLATES := Africa.txt America.txt Antarctica.txt Asia.txt \
Atlantic.txt Australia.txt Etc.txt Europe.txt Indian.txt Pacific.txt
TZNAMES_TEMPLATES_FILES := $(TZNAMES_TEMPLATES:%=$(srcdir)/%)
TZNAMES_SETS := Default Australia India
TZNAMES_SETS_FILES := $(TZNAMES_SETS:%=$(srcdir)/%)
install: installdirs
$(INSTALL_DATA) $(TZNAMES_TEMPLATES_FILES) '$(DESTDIR)$(datadir)/timezonesets'
$(INSTALL_DATA) $(TZNAMES_SETS_FILES) '$(DESTDIR)$(datadir)/timezonesets'
installdirs:
$(mkinstalldirs) '$(DESTDIR)$(datadir)/timezonesets'
uninstall:
rm -rf '$(DESTDIR)$(datadir)/timezonesets'
#
# NOTE:
# This file is NOT loaded by the PostgreSQL database. It just serves as
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
CHADT 49500 D # Chatham Daylight Time (New Zealand)
# (Pacific/Chatham)
CHAST 45900 # Chatham Standard Time (New Zealand)
# (Pacific/Chatham)
ChST 36000 # Chamorro Standard Time (lower case "h" is as in zic)
# (Pacific/Guam)
# (Pacific/Saipan)
CKT 43200 # Cook Islands Time (not in zic)
EASST -18000 D # Easter Island Summer Time (Chile)
# (Pacific/Easter)
# CONFLICT! EAST is not unique
# Other timezones:
# - EAST: East Australian Standard Time (Australia)
EAST -21600 # Easter Island Time (Chile)
# (Pacific/Easter)
FJST -46800 D # Fiji Summer Time (not in zic)
FJT -43200 # Fiji Time (not in zic)
GALT -21600 # Galapagos Time
# (Pacific/Galapagos)
GAMT -32400 # Gambier Time
# (Pacific/Gambier)
GILT 43200 # Gilbert Islands Time
# (Pacific/Tarawa)
HST -36000 # Hawaiian Standard Time
# (Pacific/Honolulu)
# (Pacific/Johnston)
KOST 39600 # Kosrae Time
# (Pacific/Kosrae)
LINT 50400 # Line Islands Time (Kiribati)
# (Pacific/Kiritimati)
MART -34200 # Marquesas Time
# (Pacific/Marquesas)
MHT 43200 # Kwajalein Time
# (Pacific/Kwajalein)
# (Pacific/Majuro)
MPT 36000 # North Mariana Islands Time (not in zic)
NCT 39600 # New Caledonia Time (not in zic)
# CONFLICT! NFT is not unique
# Other timezones:
# - NFT: Newfoundland Time (America)
NFT 41400 # Norfolk Time
# (Pacific/Norfolk)
NRT 43200 # Nauru Time
# (Pacific/Nauru)
NUT -39600 # Niue Time
# (Pacific/Niue)
NZDT 46800 D # New Zealand Daylight Time
# (Antarctica/McMurdo)
# (Pacific/Auckland)
NZST 43200 # New Zealand Standard Time
# (Antarctica/McMurdo)
# (Pacific/Auckland)
PGT 36000 # Papua New Guinea Time
# (Pacific/Port_Moresby)
PHOT 46800 # Phoenix Islands Time (Kiribati)
# (Pacific/Enderbury)
PONT 39600 # Ponape Time (Micronesia)
# (Pacific/Ponape)
PST -28800 # Pacific Standard Time
# (America/Dawson)
# (America/Los_Angeles)
# (America/Tijuana)
# (America/Vancouver)
# (America/Whitehorse)
# (Pacific/Pitcairn)
PWT 32400 # Palau Time
# (Pacific/Palau)
SBT 39600 # Solomon Islands Time
# (Pacific/Guadalcanal)
SST -39600 # South Sumatran Time
# (Pacific/Midway)
# (Pacific/Pago_Pago)
TAHT -36000 # Tahiti Time (zic says "TAHT", other sources "THAT")
# (Pacific/Tahiti)
TKT -36000 # Tokelau Time
# (Pacific/Fakaofo)
TOT 46800 # Tonga Time (not in zic)
TRUT 36000 # Truk Time (zic says "TRUT", other souces say "TRUK")
# (Pacific/Truk)
TVT 43200 # Tuvalu Time
# (Pacific/Funafuti)
VUT 39600 # Vanuata Time (not in zic)
WAKT 43200 # Wake Time
# (Pacific/Wake)
WFT 43200 # Wallis and Futuna Time
# (Pacific/Wallis)
# CONFLICT! WST is not unique
# Other timezones:
# - WST: Western Standard Time (Australia)
WST -39600 # West Samoa Time
# (Pacific/Apia)
YAPT 36000 # Yap Time (Micronesia) (not in zic)
This directory contains files with timezone sets for PostgreSQL. The problem
is that time zone abbreviations are not unique throughout the world and you
might find out that a time zone abbreviation in the `Default' set collides
with the one you wanted to use. All other files except for `Default' are
intended to override values from the `Default' set. So you might already have
a file here that serves your needs. If not, you can create your own.
In order to use one of these files, you need to set
timezone_abbreviations = 'xyz'
in any of the usual ways for setting a parameter, where xyz is the filename
that contains the desired time zone names.
If you do not find an appropriate set of time zone names for your geographic
location supplied here, please report this to <pgsql-hackers@postgresql.org>.
Your set of time zone names can then be included in future releases.
For the time being you can always add your own set.
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册