我有一个问题是我从 Rails 迁移数据库表。在表列中还包括带有时区的时间戳。
当我将数据插入数据库时,时间戳列将当前时间保存为(例如 2012-08-09 12:00:00 UTC+6:30)
我认为这意味着 2012-08-09 18:30。但是当我从 rails 3.2.6 检索这些数据时,它显示为 2012-08-09 5:30
为什么它显示为与实际时间不同的 1 小时。有什么想法吗?请
我有一个问题是我从 Rails 迁移数据库表。在表列中还包括带有时区的时间戳。
当我将数据插入数据库时,时间戳列将当前时间保存为(例如 2012-08-09 12:00:00 UTC+6:30)
我认为这意味着 2012-08-09 18:30。但是当我从 rails 3.2.6 检索这些数据时,它显示为 2012-08-09 5:30
为什么它显示为与实际时间不同的 1 小时。有什么想法吗?请
猜测一下,您使用一种timezone
设置存储它并使用不同的设置检索它。
例如,如果 Rails 认为你在 UTC+6:30 但 PostgreSQL 认为你在 UTC+5:30,并且如果 Rails 将日期发送到 Pg 时区限定但从 Pg 读取它们并假设它们在当地时间,这会发生。确保您的数据库驱动程序始终读取和写入符合时区的日期是最安全的。
鉴于一小时的差距,我想知道是否涉及夏令时,但也可能只是您的时区偏离了一小时。
regress=# create table test ( x timestamp with time zone );
CREATE TABLE
regress=# insert into test (x) values ('2012-08-09 12:00:00 UTC+6:30');
INSERT 0 1
regress=# SET TIMEZONE = '-5:30';
SET
regress=# select * from test;
x
---------------------------
2012-08-10 00:00:00+05:30
(1 row)
regress=# SET TIMEZONE = '-6:30';
SET
regress=# select * from test;
x
---------------------------
2012-08-10 01:00:00+06:30
(1 row)
或者,您的数据库可能位于时区“-1:00”,而您的应用程序在读取日期时正在剥离时区,因此日期似乎偏离了一小时。用现有的信息很难说。
为了真正帮助您,您有必要展示:
INSERT
真正插入日期的语句,通过启用log_statement = 'all'
in捕获postgresql.conf
,以及SET TIMEZONE
会话在INSERT
.SELECT
之后从数据库中读取该列的结果SET TIMEZONE = 'UTC'
时间
2012-08-09 12:00:00 UTC+6:30
保存时在时区中UTC+6:30(GMT+6:30)
。
当你检索它时,你会得到时GMT
区的时间。
两者的时间相同2012-08-09 5:30 GMT = 12:00:00 GMT+6:30
。
这是为了@CraigRinger
...
比方说...
UTC is London and UTC + 6:30 is Rangoon so...
6:30 at Rangoon = 12:00 at London
Subtracting 6:30 from both
12:00 at Rangoon = 5:30 at London
12:00 UTC+6:30 = 5:30 UTC
Data stored in UTC+6:30 = Data retrieved in UTC