从rails检索postgresql的时间戳数据时,为什么日期时间不同1小时

从rails检索postgresql的时间戳数据时,为什么日期时间不同1小时,postgresql,ruby-on-rails-3.2,migrate,rails-postgresql,timestamp-with-timezone,Postgresql,Ruby On Rails 3.2,Migrate,Rails Postgresql,Timestamp With Timezone,我有个问题就是 我从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小时。有什么想法吗?请告诉我时间 2012-08-09 12:00:00 UTC+6:30 保存时位于时区UTC+6:30(GMT+6:

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

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 

猜测一下,您正在使用一个
时区设置存储它,并使用另一个设置检索它

例如,如果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
    语句,通过在
    postgresql.conf
    中启用
    log_语句='all'
    捕获,以及会话在
    INSERT
    之前运行的任何
    SET TIMEZONE
    语句
  • 在设置时区='UTC'
  • 以及读取日期的代码

嗯,什么?否,
UTC
GMT
的新名称。它们是同一时区。运行
选择时区为'2012-01-01 00:00:00 UTC'的时间戳=时区为'2012-01-01 00:00:00 GMT'的时间戳。我相信你说的时区是对的,但考虑到1小时的时间间隔,我会对夏令时更加怀疑。此外,将你的断言转换为相等测试表明它是错误的:
SELECT TIMESTAMPTZ'2012-08-09 5:30 GMT'=TIMESTAMPTZ'2012-08-09 12:00:00 UTC+6:30'@CraigRinger即使存储数据时UTC和GMT是相同的,它是GMT+6:30时区,检索时是GMT。希望这有意义。@BaharatSinha不相信<代码>选择时区“GMT”的时间戳“2012-08-09 12:00:00 UTC+6:30”是格林尼治标准时间6:30,而不是用户报告看到的5:30。+6:30时间和5:30结果之间的时差在哪里?@BaharatSinha好的,这是有道理的。谢谢你的详细说明。我发现最初很难理解你的推理。很抱歉,我在实际时间将2012-08-09 6:30更新为2012-08-09 18:30。如果有任何答案能够帮助你。请接受一个。。。。如果答案不起作用,请考虑把你自己的解释和发生的事情,以及如何修复它,以帮助其他人谁发现这个问题在稍后的搜索。