0

我有一个问题是我从 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 小时。有什么想法吗?请

4

2 回答 2

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-12T05:29:56.467 回答
1

时间

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 
于 2012-08-11T11:24:44.060 回答