↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 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 已结束支持。 请参阅 当前版本手册.

附录 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西欧夏令时间
GMT0:00格林尼治标准时间
WET0:00西欧
WAT-1:00西非时间
NDT-2:30纽芬兰夏令时间
ADT-03:00 大西洋夏令时间
NFT-3:30纽芬兰标准时间
NST-3:30纽芬兰标准时间
AST-4:00 大西洋标准时间(加拿大)
EDT-4:00 美国东部夏令时间
ZP4-4:00GMT +4 小时
CDT-5:00 美国中部夏令时间
EST-5:00 美国东部标准时间
ZP5-5:00GMT +5 小时
CST-6:00 美国中部标准时间
MDT-6:00美国山地夏令时间
ZP6-6:00GMT +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 年)。在大多数情况下,三位数字也被接受为年份,但视具体位置而定,该数字串也可能被解释为年积日。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.