【问题标题】:Why date time different 1 hour when retrieve timestamp data of postgresql from rails为什么从rails检索postgresql的时间戳数据时日期时间不同1小时
【发布时间】:2012-08-08 11:55:20
【问题描述】:

我有一个问题是 我从 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 6:30 实时更新为 2012-08-09 18:30。
  • 如果有任何答案能够帮助你。请接受一个。
  • ... 如果答案没有帮助,请考虑发布您自己的答案,解释发生的事情以及您如何修复它,以帮助其他人稍后在搜索中找到此问题。

标签: postgresql ruby-on-rails-3.2 migrate rails-postgresql timestamp-with-timezone


【解决方案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 语句,通过在postgresql.conf 中启用log_statement = 'all' 以及会话在INSERT 之前运行的任何SET TIMEZONE 语句捕获。
  • SELECTSET TIMEZONE = 'UTC' 之后从数据库中获取该列的结果@
  • 以及读取日期的代码

【讨论】:

    【解决方案2】:

    时间

    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 
    

    【讨论】:

    • 嗯,什么?不,UTCGMT 的新名称。它们是同一时区。运行SELECT TIMESTAMP WITH TIME ZONE '2012-01-01 00:00:00 UTC' = TIMESTAMP WITH TIME ZONE '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 不相信。 SELECT TIMESTAMPTZ '2012-08-09 12:00:00 UTC+6:30' AT TIME ZONE 'GMT'; 是格林威治标准时间 6:30,而不是用户报告看到的 5:30。 +6:30 的时间和 5:30 的结果之间的小时差是从哪里来的?
    • @BaharatSinha 好的,这是有道理的。感谢您的详细说明。我发现一开始很难理解你的推理。
    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 2014-05-22
    • 2022-01-24
    • 2011-10-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多