PostgreSQL
上一页   下一页

附录 UG1. 日期/时间支持

内容
时区
历史

时区

因为目前还没有标准的 *nix 系统接口可以用于访问通用的跨时区的时区信息,Postgres 必须有一个内部的表用以时区解码。下层的 OS 用于提供输出的时区信息。

表 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 关岛标准时间,(USSR Zone 9?)
LIGT +10:00 澳大利亚墨尔本
ACST +09:30 中澳大利亚标准时间
CAST +09:30 中澳大利亚标准时间
SAT +9:30 南澳大利亚标准时间
AWSST +9:00 澳大利亚西部标准夏时制
JST +9:00 日本标准时间,(USSR Zone 8)
KST +9:00 韩国标准时间
WDT +9:00 西澳大利亚夏时制
MT +8:30 Moluccas Time(?)
AWST +8:00 澳大利亚西部标准时间
CCT +8:00 中国沿海时间
WADT +8:00 西澳大利亚夏时制
WST +8:00 西澳大利亚时间
JT +7:30 爪哇时间(译注:这里的 Java 可不是语言)
WAST +7:00 西澳大利亚标准时间
IT +3:30 伊朗时间
BT +3:00 巴格达时间
EETDST +3:00 东欧夏时制
CETDST +2:00 中欧夏时制
EET +2:00 东欧,(USSR Zone 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 Seychelles Time(?)
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 Yukon 白昼时间
HDT -9:00 夏威仪/阿拉斯加白昼时间
YST -9:00 Yukon 标准时间
AHST -10:00 夏威仪-阿拉斯加标准时间
CAT -10:00 中阿拉斯加时间
NT -11:00 州时间(Nome Time)
IDLW -12:00 国际日期变更线,西边

澳大利亚时区

澳大利亚时区和它的命名变量占了 Postgres 时区表的整整四分之一。有两个命名与美国定义的通用时区有冲突 CSTEST

如果设置了编译选项 USE_AUSTRALIAN_RULES,那么 CSTEST 将被理解为使用澳大利亚习惯。

表 UG1-2. Postgres 澳大利亚时区

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

时间日期输入解释

时间/日期类型都使用一套通用的过程进行翻译。

时间/日期解释

  1. 把输入字串分解成不同的记号,然后这些记号分类成字符串,时间,时区或者数字。
    1. 如果一个记号包含冒号(:"),那它是时间串。
    2. 如果一个记号包含划线("-"),斜杠("/"),或点("."),则是一个日期串,可能带有文本月份。
    3. 如果记号只有数字,那它要么是一个单一的域,要么是一个 ISO-8601 连接的日期(例如,"19990113" 是 1999年一月十三日)或者时间(如,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. 否则,解释成一个年份。
  4. 如果声明了 BC,把年份数值取负值并且数值偏移一(译注:先乘负一再加一)用于内部存储(在罗马纪年里面没有零年,所以数字年份 1BC 是公元零年)。
  5. 如果没有声明 BC,而且如果年份域有两位数长度,那么调整年份到 4 位数。如果数据域小于 70,那么加上 2000;否则,加 1900。

    小技巧:罗马纪元 1-99AD 可以用带前导零的 4 位数进行输入(例如,0099 是 99AD)。三位数在大多数环境下也是可以接受为一个年份的,不过根据(数字的)位置,这些数字字串也可以解释成一个日子。


上一页 首页 下一页
附录 开头 历史