9.3 9.4 9.5 9.6 10 11 12 13 14 15 16 17 Current(18)
PostgreSQL中文社区 问题报告 纠错本页面

B.4. 日期/时间配置文件 #

由于时区缩写并没有很好地标准化, PostgreSQL 提供了一种自定义 在日期时间输入中接受的缩写集的方法。 这些缩写有两个来源:

  1. TimeZone 运行时参数通常设置为 IANA 时区数据库中某个条目的名称。 如果该时区有广泛使用的时区缩写,它们将出现在 IANA 数据中,PostgreSQL 将优先识别 这些缩写及其在 IANA 数据中给出的含义。 例如,如果 timezone 设置为 America/New_York,则 EST 将被理解为 UTC-5,而 EDT 将被理解为 UTC-4。 (如果 DateStyle 设置为偏好非数字时区缩写的样式, 这些 IANA 缩写也将用于日期时间输出。)

  2. 如果在当前 IANA 时区中未找到某个缩写, 则会在 timezone_abbreviations 运行时参数指定的列表中查找。 timezone_abbreviations 列表主要用于允许 日期时间输入识别当前时区以外的时区缩写。 (这些缩写不会用于日期时间输出。)

虽然 timezone_abbreviations 参数 可以被任何数据库用户更改,但其可能的值 由数据库管理员控制 — 它们实际上是存储在 .../share/timezonesets/ 安装目录中的配置文件名称。 通过添加或更改该目录中的文件,管理员 可以为时区缩写设置本地策略。

timezone_abbreviations 可以被设置为任何在 .../share/timezonesets/ 中可以找到的文件名,前提是该文件的名字完全是字母的。 (timezone_abbreviations 中禁止非字母字符防止从预期目录的外面读取文件以及读取编辑器的备份文件和其他外部文件。)

一个时区缩写文件可以包含空行和以 # 开始的注释。非注释行必须具有下列格式之一:

zone_abbreviation offset
zone_abbreviation offset D
zone_abbreviation time_zone_name
@INCLUDE file_name
@OVERRIDE

一个 zone_abbreviation 就是被定义的缩写。offset 是一个整数,它给出以秒计的到 UTC 的等效偏移量,为正表示东起格林威治,为负表示西起格林威治。例如, -18000 表示格林威治西边的五个小时,或者北美东海岸标准时间。D 指示该区域名表示本地夏令时而非标准时间。

另外,还可以给出一个 time_zone_name,它引用 IANA 时区数据库中定义的时区名。这时会参考该时区的定义来判断在时区中是否有或者使用了该缩写。如果是,会使用适当的含义 — 也就是正在判断其值的时间戳中当前使用的含义,或者之前刚刚使用的含义(如果当时不是当前),或者最老的含义(如果只在那时之后用过)。这种行为对于处理其含义在历史上变化过的缩写是至关重要的。也允许按照缩写没有出现在其中的时区名来定义缩写,这样使用该缩写就等效于直接写出该时区名。

提示

在定义其 UTC 偏移没有改变过的缩写时,使用简单的整数 offset 更好,这样的缩写在处理时代价比那些需要查阅时区定义的缩写更低。

@INCLUDE语法允许包括.../share/timezonesets/目录中 的其他文件。允许进行嵌套包括,但是嵌套深度有限制。

@OVERRIDE语法表示文件中后续项可以覆盖前面的项(典型的:从被包括的文件中 得到的项)。如果没有它,同一个时区缩写的相互冲突的定义会被认为是一种错误。

在一个未被修改的安装中,文件Default包含用于世界大部分地区的非冲突时区缩 写。附加文件AustraliaIndia被提供给那些地区:这些文件 首先会包括Default文件,并且接着根据需要增加或修改缩写。

为了参考目的,标准安装还包含文件Africa.txtAmerica.txt等, 包含根据IANA时区数据库已知使用的每个时区缩写的信息。这些文件中找到的区域名称定义可以根据需要复制并粘贴到自定义配置文件中。 请注意,由于它们的名称中嵌有点,这些文件不能直接作为timezone_abbreviations设置进行引用。

注意

如果在读取时区缩写集时发生错误,将不会应用任何新值并且保留旧的集合。如果该错误是在数据库 启动时发生,那么启动将失败。

小心

配置文件中定义的时区缩写将会覆盖PostgreSQL中内建的非 时区含义。例如Australia配置文件定义了SAT(南澳洲标准时 间)。当该文件为活动时,SAT将不会被识别为周六的缩写。

小心

如果你修改.../share/timezonesets/中的文件, 那么你必须自己创建备份 — 因为通常的数据库转储不会包括这个目录。