Ruby on rails 为什么Rails将Postgres函数返回的时间更改为UTC?

Ruby on rails 为什么Rails将Postgres函数返回的时间更改为UTC?,ruby-on-rails,timezone,rails-postgresql,Ruby On Rails,Timezone,Rails Postgresql,有人能解释一下吗?就好像Rails正在覆盖Postgres,并告诉它在UTC工作,而我希望它在本地时区工作 我有一个Postgres函数,它返回本地时间,如下所示: CREATE OR REPLACE FUNCTION fn_lib_now() RETURNS TIMESTAMP AS $$ DECLARE l_now TIMESTAMP; BEGIN l_now = LOCALTIMESTAMP; -- Debug code that writes to local file DROP TA

有人能解释一下吗?就好像Rails正在覆盖Postgres,并告诉它在UTC工作,而我希望它在本地时区工作

我有一个Postgres函数,它返回本地时间,如下所示:

CREATE OR REPLACE FUNCTION fn_lib_now() RETURNS TIMESTAMP AS $$
DECLARE
l_now TIMESTAMP;
BEGIN
l_now = LOCALTIMESTAMP;

-- Debug code that writes to local file
DROP TABLE IF EXISTS x;
CREATE TABLE x (a TEXT);
INSERT INTO x (a) VALUES (l_now);
COPY (SELECT x.a AS localnow, LOCALTIMESTAMP AS local_timestamp, LOCALTIMESTAMP::date         AS local_date, LOCALTIME AS local_time, CURRENT_DATE AS current_date, CURRENT_TIME AS current_time FROM x) TO 'C:\temp\a.txt' WITH CSV HEADER;

-- Success
RETURN l_now;
END;
$$ LANGUAGE plpgsql;
如果我使用
从PSQL运行函数,请选择fn_lib_now()

我在PSQL中得到结果:“2013-05-07 18:59:43.916”(正确的当地时间)

我的调试输出(重新格式化)是:

请注意,返回的所有时间都与本地时间匹配

但是,如果我使用以下命令从Rails调用函数:

begin
  result = (self.class.find_by_sql(["SELECT fn_lib_now() AS nowout"])).first
rescue ActiveRecord::WrappedDatabaseException => e
  raise self.class.handle_sql_error(e)
end
puts result[:nowout]
我得到返回值:
'2013-05-07 09:11:10.142'

我的调试输出(重新格式化)是:

请注意,所有时间都与UTC(比我的澳大利亚时区晚10小时)匹配

当从PSQL(本地时间)和Rails(UTC)调用同一函数时,为什么要返回不同的结果,特别是当my application.rb有以下行时:

config.time_zone = 'Brisbane'

考虑使用<代码>时间戳和时区< /代码>(<代码> TimeSTAMPTZ ),而不是<代码>时间戳,没有时区< /代码>(普通代码>时间戳< /代码>)。后者的语义通常更有意义,除非您特别关注捕获细节,如DST转换期间的两个本地1am中的哪一个-即使如此,您也需要存储tz偏移量以及时间戳以使其有用。(不保证这会帮助ActiveRecord不疯狂,这只是一个好主意)。
localnow,                  local_timestamp,         local_date,  local_time,     current_date,  current_time
2013-05-07 09:11:10.142,  2013-05-07 09:11:10.142,  2013-05-07,  09:11:10.142,     2013-05-07,    09:11:10.142+00
config.time_zone = 'Brisbane'