Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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
Postgres或Ruby是否将时区添加到我的“没有时区的时间戳”列中?_Ruby_Postgresql_Jdbc_Timezone_Timestamp - Fatal编程技术网

Postgres或Ruby是否将时区添加到我的“没有时区的时间戳”列中?

Postgres或Ruby是否将时区添加到我的“没有时区的时间戳”列中?,ruby,postgresql,jdbc,timezone,timestamp,Ruby,Postgresql,Jdbc,Timezone,Timestamp,如果我用选择当前设置(“时区”)查询我的数据库,我会得到“UTC”(如预期) 我使用PgAdmin运行以下查询: SELECT foo FROM bar PgAdmin显示“2011-03-12 08:00:00”。然而,当我从Ruby读取值时(据我所知,使用DataMapper使用'org.postgresql.Driver'JDBC驱动程序),它显示“2011-03-12 08:00:00-0700” 问题:在整个堆栈中,时区添加在哪里?虽然我意识到很多事情都取决于我的堆栈的细节,但了解应

如果我用
选择当前设置(“时区”)
查询我的数据库,我会得到“UTC”(如预期)

我使用PgAdmin运行以下查询:

SELECT foo FROM bar
PgAdmin显示“2011-03-12 08:00:00”。然而,当我从Ruby读取值时(据我所知,使用DataMapper使用'org.postgresql.Driver'JDBC驱动程序),它显示“2011-03-12 08:00:00-0700”


问题:在整个堆栈中,时区添加在哪里?虽然我意识到很多事情都取决于我的堆栈的细节,但了解应该发生什么事情确实会有帮助,这样我就可以排除问题。例如,对于没有时区的
时间戳列,我是否应该期望JDBC驱动程序给出一个没有时区信息的“原始”值?

Ruby中的某些东西正在进行时区调整:

psql=> select current_setting('timezone');
 current_setting
-----------------
 Canada/Pacific
(1 row)

psql=> select min(created_at) from people;
            min
----------------------------
 2010-07-09 13:58:51.320659
(1 row)

psql=> set timezone = 'utc';
psql=> select current_setting('timezone');
 current_setting
-----------------
 UTC
(1 row)

psql=> select min(created_at) from people;
            min
----------------------------
 2010-07-09 13:58:51.320659
(1 row)

您可以通过在Ruby中对时间戳执行原始SQL查询并查看返回的字符串来检查这一点。

在读取不带时区的时间戳时,JDBC驱动程序大胆/合理地假设该时间戳在JVM时区中表示。

如果您不想添加时区,使用“不带时区的时间戳”类型。 这样,读者将始终阅读您插入的相同秒/小时/分钟/天/月/年

我用了下面的程序来复制它

create table t (
without_tz timestamp  without time zone ,
with_tz timestamp  with time zone 
)
SET SESSION TIME ZONE default;
insert into t VALUES ( now(), now() )
select * from t;
SET SESSION TIME ZONE PST8PDT;
insert into t VALUES ( now(), now() )
select * from t;
SET SESSION TIME ZONE PST6PDT;
insert into t VALUES ( now(), now() )
select * from t;
通过观察select的值,我得出以下结论:

  • 没有时区的时间戳永远不会转换。无论你在哪个时区,你都会读到你插入的相同的秒/小时/分钟/天/月/年

    • 带时区的时间戳将读取的值转换为时区。它们表示相同的瞬间(时间点),但小时(有时是天,有时甚至是分钟)值将不同