Postgres:“ AT TIME ZONE'localtime'” ==“ AT TIME ZONE'utc'”?

sti*_*ing 4 postgresql time timezone

我正在努力了解其"AT TIME ZONE 'localtime'"工作原理?通过玩弄它,我发现它的作用完全与"AT TIME ZONE 'UTC'"……但是为什么呢?是postgres "localtime"的同义词"UTC"吗?或它来自某个设置(环境?连接时区?尽管同时选中了两者,但似乎它们并不相关)...

"localtime"功能,但我认为这里不涉及。

示例SQL:

# date
Thu Dec  8 12:00:05 AEDT 2016

# SELECT LOCALTIMESTAMP;
----------------------------
 2016-12-08 01:13:29.444725

# SELECT LOCALTIMESTAMP AT TIME ZONE 'America/New_York';
-------------------------------
 2016-12-08 06:08:31.183103+00

# SELECT LOCALTIMESTAMP AT TIME ZONE'localtime';
------------------------------
 2016-12-08 01:09:25.294063+00

# SELECT LOCALTIMESTAMP AT TIME ZONE 'utc';
 -------------------------------
 2016-12-08 01:09:44.32587+00 -- SAME AS ABOVE

 # SET TIME ZONE 'America/New_York';

 # SELECT LOCALTIMESTAMP;
 ----------------------------
  2016-12-07 20:13:34.924647

 # SELECT LOCALTIMESTAMP AT TIME ZONE 'localtime';
 ------------------------------
  2016-12-07 15:10:08.188197-05

 # SELECT LOCALTIMESTAMP AT TIME ZONE 'utc';
 ------------------------------
  2016-12-07 15:10:44.88332-05 -- SAME AS ABOVE
Run Code Online (Sandbox Code Playgroud)

有什么提示吗?是否记录在某处?

Tim*_*sen 6

Postgres中的时间戳实际上并不存储任何时区信息。而是,此信息来自服务器设置的时区。在内部,所有时间戳信息均以UTC时间记录。因此,例如,如果您从UTC以外的时区存储了时间戳信息,则Postgres将在存储之前先将其转换为UTC。

文档中

对于带时区的时间戳,内部存储的值始终以UTC(通用协调时间,通常称为格林威治标准时间,GMT)表示。使用该时区的适当偏移量,将指定了明确时区的输入值转换为UTC。如果在输入字符串中未指定任何时区,则假定该时区位于系统的时区参数指示的时区中,并使用时区的偏移量将其转换为UTC。

对于您的实际问题,localtime只是服务器的时区始终为UTC。

此外,似乎Postgres localtime只是包装了C库函数localtime(),该函数试图查找本地系统时间(默认为UTC时间)。同样,从文档中

如果未在postgresql.conf中指定时区或未将其指定为服务器命令行选项,则服务器将尝试使用TZ环境变量的值作为默认时区。如果未定义TZ或不是PostgreSQL已知的任何时区名称,服务器将通过检查C库函数localtime()的行为来尝试确定操作系统的默认时区。默认时区被选为PostgreSQL已知时区中最接近的匹配项。(如果未指定,这些规则也用于选择log_timezone的默认值。)