gpt4 book ai didi

ruby - 为什么 Ruby 续集和 Postgres psql 的时区信息不同?

转载 作者:行者123 更新时间:2023-11-29 13:06:02 25 4
gpt4 key购买 nike

这是来自 Postgres 的查询结果:

$ psql ... -c 'select the_date from foo where foo_id in (998,999)'
the_date
------------------------
2012-03-07 09:34:47.98
2012-03-16 11:31:25.336

the_date 是“没有时区的时间戳”。

这是一个 Ruby 程序:

#!/usr/bin/env ruby

require 'sequel'

@DB = Sequel.connect({...})
query = "select the_date from foo where foo_id in (998,999)"
@DB[query].each do |row|
warn row
end

和一些输出:

{:the_date=>2012-03-07 09:34:47 -0600}
{:the_date=>2012-03-16 11:31:25 -0500}

-0500 和 -0600 从何而来?那是服务器和客户端机器(美国/中部)的“Olson timezone”,但为什么 Ruby 添加它而 psql 没有?

我一直在阅读 the docs ,我彻底糊涂了。

服务器是Postgres 9.0.4,客户端是psql 9.1.4,续集是3.33.0。

最佳答案

该列的类型为“没有时区的时间戳”。因此,当 Postgres 在此列中显示一个值时,它只显示没有时区的时间戳。但是,Sequel 想要将 Postgres 时间戳转换为 Ruby Time 类的实例,并且 Time 类的实例必须指定时区——要么是本地时区的时间,要么是 UTC 时间。因此Sequel必须选择一个。默认情况下,它会选择您本地的时区。

您可以在 Sequel 中配置数据库和应用程序时区。参见 https://www.rubydoc.info/gems/sequel/4.36.0/Sequel/Timezones

例如,这是我手边的数据库的默认 Sequel 行为:

>   c['select * from actors'].each do |row|; puts row[:created_at]; end
Thu Jul 12 20:33:17 -0400 2012

此处假定时间戳在我本地的时区 (EDT)。

但是,如果我这样做:

> Sequel.database_timezone = :utc
=> :utc
> c['select * from actors'].each do |row|; puts row[:created_at]; end
Thu Jul 12 20:33:17 UTC 2012

然后假定时间戳为 UTC。

关于ruby - 为什么 Ruby 续集和 Postgres psql 的时区信息不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11768530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com