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)
有什么提示吗?是否记录在某处?
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的默认值。)
| 归档时间: |
|
| 查看次数: |
5093 次 |
| 最近记录: |