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

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

已结束支持的版本: 7.2
历史版本。 PostgreSQL 7.2 已结束支持。 请参阅 当前版本手册.

A.2. 时区 #

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

下表列出了 PostgreSQL 识别的时区,它按与 UTC 的时区偏移组织,而不是按字母顺序;这样做的目的是便于在本地用法与已识别缩写可能不一致的情况下将两者匹配起来。

表 A.4. PostgreSQL 识别的时区

时区与 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澳大利亚墨尔本
SAST+09:30南澳标准时间
CAST+09:30中澳标准时间
AWSST+09:00澳大利亚西部夏季标准时间
JST+09:00日本标准时间,苏联 8 区
KST+09:00韩国标准时间
MHT+09:00夸贾林时间
WDT+09:00西澳夏令时间
MT+08:30摩鹿加时间
AWST+08:00澳大利亚西部标准时间
CCT+08:00中国沿海时间
WADT+08:00西澳夏令时间
WST+08:00西澳标准时间
JT+07:30爪哇时间
ALMST+07:00阿拉木图夏令时间
WAST+07:00西澳标准时间
CXT+07:00圣诞岛时间
ALMT+06:00阿拉木图时间
MAWT+06:00莫森(南极洲)时间
IOT+05:00印度查戈斯时间
MVT+05:00马尔代夫群岛时间
TFT+05:00凯尔盖朗时间
AFT+04:30阿富汗时间
EAST+04:00安塔那那利佛夏令时间
MUT+04:00毛里求斯岛时间
RET+04:00留尼汪岛时间
SCT+04:00马埃岛时间
IT+03:30伊朗时间
EAT+03:00安塔那那利佛、科摩罗时间
BT+03:00巴格达时间
EETDST+03:00东欧夏令时间
HMT+03:00希腊地中海时间(?)
BDST+02:00英国双标准时间
CEST+02:00中欧夏令时间
CETDST+02:00中欧夏令时间
EET+02:00东欧,苏联 1 区
FWT+02:00法国冬令时间
IST+02:00以色列标准时间
MEST+02:00中欧夏令时间
METDST+02:00中欧夏令时间
SST+02:00瑞典夏令时间
BST+01:00英国夏令时间
CET+01:00中欧时间
DNT+01:00Dansk Normal Tid
FST+01:00法国夏令时间
MET+01:00中欧时间
MEWT+01:00中欧冬令时间
MEZ+01:00中欧时区
NOR+01:00挪威标准时间
SET+01:00塞舌尔时间
SWT+01:00瑞典冬令时间
WETDST+01:00西欧夏令时间
GMT+00:00格林尼治标准时间
UT+00:00世界时
UTC+00:00协调世界时
Z+00:00与 UTC 相同
ZULU+00:00与 UTC 相同
WET+00:00西欧
WAT-01:00西非时间
NDT-02:30纽芬兰夏令时间
ADT-03:00大西洋夏令时间
AWT-03:00(未知)
NFT-03:30纽芬兰标准时间
NST-03:30纽芬兰标准时间
AST-04:00大西洋标准时间(加拿大)
ACST-04:00Atlantic/Porto Acre 夏令时间
ACT-05:00Atlantic/Porto Acre 标准时间
EDT-04:00美国东部夏令时间
CDT-05:00美国中部夏令时间
EST-05:00美国东部标准时间
CST-06:00美国中部标准时间
MDT-06:00美国山地夏令时间
MST-07:00美国山地标准时间
PDT-07:00美国太平洋夏令时间
AKDT-08:00阿拉斯加夏令时间
PST-08:00美国太平洋标准时间
YDT-08:00育空夏令时间
AKST-09:00阿拉斯加标准时间
HDT-09:00夏威夷/阿拉斯加夏令时间
YST-09:00育空标准时间
AHST-10:00阿拉斯加-夏威夷标准时间
HST-10:00夏威夷标准时间
CAT-10:00阿拉斯加中部时间
NT-11:00诺姆时间
IDLW-12:00国际日期变更线以西


A.2.1. 澳大利亚时区

澳大利亚时区及其命名变体占了 PostgreSQL 时区查找表中整整四分之一的条目。它们与美国常用的时区存在两处命名冲突:CST 和 EST。

如果设置了运行时选项 AUSTRALIAN_TIMEZONES,那么 CST、EST 和 SAT 将被解释为澳大利亚时区名。不设置该选项时,CST 和 EST 会被当作美国时区名,而 SAT 会被解释为一个表示 Saturday 的噪声词。

表 A.5. PostgreSQL 澳大利亚时区

时区与 UTC 的偏移描述
ACST+09:30中澳标准时间
CST+10:30澳大利亚中部标准时间
EST+10:00澳大利亚东部标准时间
SAT+09:30南澳标准时间


A.2.2. 日期/时间输入解释

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

日期/时间输入解释

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

    1. 如果数字词元包含冒号(":"),则它是一个时间字符串。其后的所有数字和冒号都包括在内。

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

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

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

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

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

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

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

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

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

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

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

    3. 如果是四位或六位数字并且已经读取了年份,则解释为时间。

    4. 如果是四位或更多位数字,则解释为年份。

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

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

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

    8. 如果是两位数字或四位及更多位数字,则解释为年份。

    9. 否则,抛出错误。

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

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

    提示

    格里高利历公元 1-99 年可以使用带前导零的 4 位数字输入(例如,0099 表示公元 99 年)。以前的 PostgreSQL 版本接受三位数字和单个数字的年份,但从 7.0 版开始,规则已被收紧以减少歧义的可能性。

报告文档问题

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