您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

A.2. 时区

因为目前还没有标准的 *nix 系统接口可以用于访问通用的跨时区的时区信息, 所以 PostgreSQL 包含一个内部的小表用以时区解码。 不过,下层的 OS 的确 提供了 输出 时区信息。

下面这个 PostgreSQL 能够识别的 时区表是以它们相对 UTC 的时区偏移量来组织的,而不是按照字母顺序; 我们的目的是能实现匹配那些区域中有这些缩写的区域用户, 以免这些缩写混淆.

Table 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 关岛标准时间,USSR Zone 9
LIGT +10:00 澳大利亚墨尔本
CAST +09:30 中澳大利亚标准时间
SAST +09:30 南澳大利亚标准时间
CAST +09:30 中澳大利亚标准时间
AWSST +09:00 澳大利亚西部标准夏时制
JST +09:00 日本标准时间,(USSR Zone 8)
KST +09:00 韩国标准时间
MHT +09:00 Kwajalein Time
WDT +09:00 西澳大利亚夏时制
MT +08:30 毛里求斯(moluccas)时间(?)
AWST +08:00 澳大利亚西部标准时间
CCT +08:00 中国沿海时间
WADT +08:00 西澳大利亚夏时制
WST +08:00 西澳大利亚标准时间
JT +07:30 爪哇时间
ALMST +07:00 Almaty 夏令时
WAST +07:00 西澳大利亚标准时间
CXT +07:00 Christmas (复活节?)岛时间
ALMT +06:00 Almaty 时间
MAWT +06:00 Mawson (Antarctica) Time
IOT +05:00 印度 Chagos 时间
MVT +05:00 Maldives (?)岛时间
TFT +05:00 Kerguelen 时间
AFT +04:30 阿富汗时间
EAST +04:00 Antananarivo Savings Time
MUT +04:00 Mauritius Island Time
RET +04:00 Reunion Island Time
SCT +04:00 Mahe Island Time
IT +03:30 伊朗时间
EAT +03:00 Antananarivo, Comoro Time
BT +03:00 巴格达时间
EETDST +03:00 东欧夏时制
HMT +03:00 Hellas Mediterranean Time (?)
BDST +02:00 British Double Standard Time
CEST +02:00 Central European Savings Time
CETDST +02:00 中欧夏时制
EET +02:00 东欧,(USSR Zone 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 Seychelles Time(?)
SWT +01:00 瑞典冬时制
WETDST +01:00 西欧光照利用时间(夏时制)
GMT 0:00 格林威治标准时间
UT +00:00 全球时间
UTC +00:00 校准的全球时间
Z +00:00 和 UTC 相同
ZULU +00:00 和 UTC 相同
WET +00:00 西欧
WAT -01:00 西非时间
NDT -02:30 纽芬兰(Newfoundland)白昼时间
ADT -03:00 大西洋白昼时间
AWT -03:00 (未知)
NFT -03:30 纽芬兰(Newfoundland)标准时间
NST -03:30 纽芬兰(Newfoundland)标准时间
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 山区白昼时间(译注:Mountain Daylight Time那位知道怎么译?)
MST -07:00 山区标准时间
PDT -07:00 太平洋白昼时间
AKDT -08:00 阿拉斯加白昼时间
PST -08:00 太平洋标准时间
YDT -08:00 Yukon 白昼时间
AKST -09:00 阿拉斯加标准时间
HDT -09:00 夏威仪/阿拉斯加白昼时间
YST -09:00 Yukon 标准时
AHST -10:00 夏威夷-阿拉斯加标准时间
HST -10:00 夏威夷标准时间
CAT -10:00 中阿拉斯加时间
NT -11:00 州时间(Nome Time)
IDLW -12:00 国际日期变更线,西边

A.2.1. 澳大利亚时区

澳大利亚时区和它的命名变体占了 PostgreSQL 时区表的整整四分之一。 有两个命名与美国使用的通用时区有冲突 CST EST

如果设置了运行时选项 USE_AUSTRALIAN_RULES,那么 CST EST SAT 将被解释为澳大利亚时区的名字。 如果没有这个选项, CST EST 将 被解释成美国时区名字,而 SAT 则是 表示" Saturday(星期六) "的无用字符.

Table 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年一月十三日)或者时间(如,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,把年份数值取负值并且数值加一 用于内部存储(在罗马纪年里面没有零年,所以数字年份 1BC 是公元零年)。

  5. 如果没有声明 BC,而且如果年份域有两位数长度, 那么调整年份到 4 位数。如果数据域小于 70,那么加上 2000; 否则,加 1900。

    技巧: 罗马纪元 1-99AD 可以用带前导零的 4 位数进行输入 (例如,0099 是 99AD)。 早期的 PostgreSQL 接受 三位数字或者一位数字做年份,但是到了 v7.0,我们把规则定得 更严格,以减少歧义的可能.