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