↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5
历史版本PostgreSQL 6.5 已于 2004 年 6 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

附录 UG1. 日期/时间支持

UG1.1. 时区

Postgres 必须拥有用于时区解码的内部表格式信息,因为没有标准的 *nix 系统接口可用于访问通用的跨时区信息。底层操作系统确实被用来为输出提供时区信息。

表 UG1.1. Postgres 识别的时区

时区 与 UTC 的偏移 描述
NZDT +13:00 新西兰夏令时间
IDLE +12:00 国际日期变更线以东
NZST +12:00 新西兰标准时间
NZT +12:00 新西兰时间
AESST +11:00 澳大利亚东部夏季标准时间
ACSST +10:30 中澳夏季标准时间
CADT +10:30 中澳夏令时间
SADT +10:30 南澳夏令时间
AEST +10:00 澳大利亚东部标准时间
EAST +10:00 澳东标准时间
GST +10:00 关岛标准时间,苏联 9 区
LIGT +10:00 澳大利亚墨尔本
ACST +09:30 中澳标准时间
CAST +09:30 中澳标准时间
SAT +9:30 南澳标准时间
AWSST +9:00 澳大利亚西部夏季标准时间
JST +9:00 日本标准时间,苏联 8 区
KST +9:00 韩国标准时间
WDT +9:00 西澳夏令时间
MT +8:30 摩鹿加时间
AWST +8:00 澳大利亚西部标准时间
CCT +8:00 中国沿海时间
WADT +8:00 西澳夏令时间
WST +8:00 西澳标准时间
JT +7:30 爪哇时间
WAST +7:00 西澳标准时间
IT +3:30 伊朗时间
BT +3:00 巴格达时间
EETDST +3:00 东欧夏令时间
CETDST +2:00 中欧夏令时间
EET +2:00 东欧,苏联 1 区
FWT +2:00 法国冬令时间
IST +2:00 以色列标准时间
MEST +2:00 中欧夏令时间
METDST +2:00 中欧夏令时间
SST +2:00 瑞典夏令时间
BST +1:00 英国夏令时间
CET +1:00 中欧时间
DNT +1:00 Dansk Normal Tid
DST +1:00 Dansk Standard Time (?)
FST +1:00 法国夏令时间
MET +1:00 中欧时间
MEWT +1:00 中欧冬令时间
MEZ +1:00 中欧时区
NOR +1:00 挪威标准时间
SET +1:00 塞舌尔时间
SWT +1:00 瑞典冬令时间
WETDST +1:00 西欧夏令时间
GMT 0:00 格林尼治标准时间
WET 0:00 西欧
WAT -1:00 西非时间
NDT -2:30 纽芬兰夏令时间
ADT -03:00 大西洋夏令时间
NFT -3:30 纽芬兰标准时间
NST -3:30 纽芬兰标准时间
AST -4:00 大西洋标准时间(加拿大)
EDT -4:00 美国东部夏令时间
ZP4 -4:00 GMT +4 小时
CDT -5:00 美国中部夏令时间
EST -5:00 美国东部标准时间
ZP5 -5:00 GMT +5 小时
CST -6:00 美国中部标准时间
MDT -6:00 美国山地夏令时间
ZP6 -6:00 GMT +6 小时
MST -7:00 美国山地标准时间
PDT -7:00 美国太平洋夏令时间
PST -8:00 美国太平洋标准时间
YDT -8:00 育空夏令时间
HDT -9:00 夏威夷/阿拉斯加夏令时间
YST -9:00 育空标准时间
AHST -10:00 阿拉斯加-夏威夷标准时间
CAT -10:00 阿拉斯加中部时间
NT -11:00 诺姆时间
IDLW -12:00 国际日期变更线以西


注意

如果设置了编译器选项 USE_AUSTRALIAN_RULES,那么 EST 指澳大利亚东部标准时间,其与 UTC 的偏移为 +10:00 小时。

澳大利亚时区及其命名变体占了 Postgres 时区查找表中整整四分之一的条目。

日期/时间输入解释

日期/时间类型都使用一组公共的例程进行解码。

  1. 将输入字符串拆分为词元,并把每个词元归类为字符串、时间、时区或数字。

    1. 如果词元包含冒号(":"),则它是一个时间字符串。

    2. 如果词元包含连字符("-")、斜杠("/")或点("."),则它是一个日期字符串,并且可能带有文本形式的月份。

    3. 如果词元是纯数字,那么它要么是一个单个字段,要么是一个 ISO-8601 拼接式日期(例如 "19990113" 表示 1999 年 1 月 13 日)或时间(例如 141516 表示 14:15:16)。

    4. 如果词元以加号("+")或减号("-")开头,那么它要么是一个时区,要么是一个特殊字段。

  2. 如果词元是一个文本字符串,则将其与可能的字符串匹配。

    1. 对该词元做二分查找表匹配,看它是否为特殊字符串(例如 today)、星期名(例如 Thursday)、 月份名(例如 January)或噪声词(例如 on)。

      设置字段值和字段位掩码。例如,为 today 设置年、月、日,并为 now 额外设置时、分、秒。

    2. 如果没有找到,则做一次类似的二分查找表匹配,尝试将该词元与时区匹配。

    3. 如果没有找到,则抛出错误。

  3. 该词元是一个数字或数字字段。

    1. 如果多于 4 位数字,并且之前还没有读取到其他日期字段,则将其解释为"拼接式日期"(例如 19990118)。8 位和 6 位数字被解释为年、月、日,而 7 位和 5 位数字则被解释为年、年积日。

    2. 如果词元是三位数字并且已经解码了年份,则解释为年积日。

    3. 如果多于两位数字,则解释为年份。

    4. 如果处于欧洲日期模式,并且还没有读取日字段,并且该值小于或等于 31,则解释为日。

    5. 如果处于非欧洲(美国)日期模式,并且还没有读取月份字段,并且该值小于或等于 12,则解释为月。

    6. 如果还没有读取日字段,并且该值小于或等于 31,则解释为月。

    7. 如果还没有读取月份字段,并且该值小于或等于 12,则解释为月。

    8. 否则,解释为年份。

  4. 如果指定了 BC,则将年份取反并偏移一后再用于内部存储(格里高利历中没有 0 年,因此从数值上说, 1BC 会变成年 0)。

  5. 如果没有指定 BC,并且年份字段的长度为两位,则将年份调整为 4 位。如果该字段小于 70,则加上 2000;否则加上 1900。

    提示

    格里高利历公元 1-99 年可以使用带前导零的 4 位数字输入(例如,0099 表示公元 99 年)。在大多数情况下,三位数字也被接受为年份,但视具体位置而定,该数字串也可能被解释为年积日。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。