pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
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:00 | Dansk 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:00 | Atlantic/Porto Acre 夏令时间 |
| ACT | -05:00 | Atlantic/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 | 国际日期变更线以西 |
澳大利亚时区及其命名变体占了 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 | 南澳标准时间 |
日期/时间类型都使用一组公共的例程进行解码。
日期/时间输入解释
将输入字符串拆分为词元,并把每个词元归类为字符串、时间、时区或数字。
如果数字词元包含冒号(":"),则它是一个时间字符串。其后的所有数字和冒号都包括在内。
如果数字词元包含连字符("-")、斜杠("/")或两个以上的点("."),则它是一个日期字符串,并且可能带有文本形式的月份。
如果词元是纯数字,那么它要么是一个单个字段,要么是一个 ISO-8601 拼接式日期(例如 19990113 表示 1999 年 1 月 13 日) 或时间(例如 141516 表示 14:15:16)。
如果词元以加号("+")或减号("-")开头,那么它要么是一个时区,要么是一个特殊字段。
如果词元是一个文本字符串,则将其与可能的字符串匹配。
对该词元做二分查找表匹配,看它是否为特殊字符串(例如 today)、星期名(例如 Thursday)、 月份名(例如 January)或噪声词(例如 at、on)。
设置字段值和字段位掩码。例如,为 today 设置年、月、日,并为 now 额外设置时、分、秒。
如果没有找到,则做一次类似的二分查找表匹配,尝试将该词元与时区匹配。
如果没有找到,则抛出错误。
该词元是一个数字或数字字段。
如果多于 4 位数字,并且之前还没有读取到其他日期字段,则将其解释为“拼接式日期”(例如 19990118)。8 位和 6 位数字被解释为年、月、日,而 7 位和 5 位数字则分别被解释为年、年积日。
如果词元是三位数字并且已经解码了年份,则解释为年积日。
如果是四位或六位数字并且已经读取了年份,则解释为时间。
如果是四位或更多位数字,则解释为年份。
如果处于欧洲日期模式,并且还没有读取日字段,并且该值小于或等于 31,则解释为日。
如果还没有读取月份字段,并且该值小于或等于 12,则解释为月。
如果还没有读取日字段,并且该值小于或等于 31,则解释为日。
如果是两位数字或四位及更多位数字,则解释为年份。
否则,抛出错误。
如果指定了 BC,则将年份取反并加一后再用于内部存储(格里高利历中没有 0 年,因此从数值上说,1BC 会变成年 0)。
如果没有指定 BC,并且年份字段的长度为两位,则将年份调整为 4 位。如果该字段小于 70,则加上 2000;否则加上 1900。
格里高利历公元 1-99 年可以使用带前导零的 4 位数字输入(例如,0099 表示公元 99 年)。以前的 PostgreSQL 版本接受三位数字和单个数字的年份,但从 7.0 版开始,规则已被收紧以减少歧义的可能性。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。