Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 区分夏令时转换期间的时间_Postgresql_Logging_Time - Fatal编程技术网

Postgresql 区分夏令时转换期间的时间

Postgresql 区分夏令时转换期间的时间,postgresql,logging,time,Postgresql,Logging,Time,我查看了一些来自英国时区的输出,该时区跨越了夏令时转换(对于任何不知道的人,在10月最后一个星期日的早上,重复凌晨1点减去一小时,同样在3月的最后一个星期日,它向前移动1小时)。输出显示的事件似乎在时间上倒退-显然这是小时重置的结果,但是没有任何时间偏移列表,确定正确时间的唯一逻辑方法是查看它们的顺序。我知道Postgres在UTC内部存储带有时区的时间戳,但如果指定了时区,则会记录偏移量,例如: select '2019-10-27 00:30:00 UTC'::timestamptz

我查看了一些来自英国时区的输出,该时区跨越了夏令时转换(对于任何不知道的人,在10月最后一个星期日的早上,重复凌晨1点减去一小时,同样在3月的最后一个星期日,它向前移动1小时)。输出显示的事件似乎在时间上倒退-显然这是小时重置的结果,但是没有任何时间偏移列表,确定正确时间的唯一逻辑方法是查看它们的顺序。我知道Postgres在UTC内部存储带有时区的时间戳,但如果指定了时区,则会记录偏移量,例如:

select
    '2019-10-27 00:30:00 UTC'::timestamptz at time zone 'Europe/London' time1,
    '2019-10-27 01:30:00 UTC'::timestamptz at time zone 'Europe/London' time2,
    '2020-03-29 00:30:00 UTC'::timestamptz at time zone 'Europe/London' time3,
    '2020-03-29 01:30:00 UTC'::timestamptz at time zone 'Europe/London' time4;
下面您可以看到,10月份的转换将给出00:30和01:30期间完全相同的时间,但它不显示时区偏移,因此无法区分两者之间的差异

        time1        |        time2        |        time3        |        time4        
---------------------+---------------------+---------------------+---------------------
 2019-10-27 01:30:00 | 2019-10-27 01:30:00 | 2020-03-29 00:30:00 | 2020-03-29 02:30:00

显然,这不仅仅是一个只影响Postgres的问题,而且输出到一个日志文件,该日志文件不使用偏移量,因此没有明确的方法来回顾《纽约时报》。我很幸运,订单确实说明了这一点,但假设在这样的2小时内只有一个事件,那么在未来处理这个(合理不规则的)问题的最佳实践是什么?偏移量只能在这些期间显示,还是有其他解决方案?

解决方案很简单:不记录本地时间戳

记录时区信息和时间戳,或在记录之前将其转换为UTC:

SET timezone = 'Europe/London';

select                         
    '2019-10-27 00:30:00 UTC'::timestamptz time1,
    '2019-10-27 01:30:00 UTC'::timestamptz time2,
    '2020-03-29 00:30:00 UTC'::timestamptz time3,
    '2020-03-29 01:30:00 UTC'::timestamptz time4;

         time1          |         time2          |         time3          |         time4          
------------------------+------------------------+------------------------+------------------------
 2019-10-27 01:30:00+01 | 2019-10-27 01:30:00+00 | 2020-03-29 00:30:00+00 | 2020-03-29 02:30:00+01
(1 row)

select                         
    '2019-10-27 00:30:00 UTC'::timestamptz at time zone 'UTC' time1,
    '2019-10-27 01:30:00 UTC'::timestamptz at time zone 'UTC' time2,
    '2020-03-29 00:30:00 UTC'::timestamptz at time zone 'UTC' time3,
    '2020-03-29 01:30:00 UTC'::timestamptz at time zone 'UTC' time4;

        time1        |        time2        |        time3        |        time4        
---------------------+---------------------+---------------------+---------------------
 2019-10-27 00:30:00 | 2019-10-27 01:30:00 | 2020-03-29 00:30:00 | 2020-03-29 01:30:00
(1 row)