1

这是 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 是从哪里来的?那是服务器和客户端机器(美国/中部)的“奥尔森时区”,但为什么 Ruby 添加它而 psql 没有呢?

我一直在阅读文档,我很困惑。

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

4

2 回答 2

2

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

您可以在 Sequel 中配置数据库和应用程序时区。请参阅http://sequel.rubyforge.org/rdoc/classes/Sequel/Timezones.html

例如,这是我方便使用的数据库的默认 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。

于 2012-08-02T02:30:22.820 回答
0

我对红宝石和日期/时间/时间戳进行了一些奇怪的处理。看起来程序正在尝试将结果转换为已知的数据类型并自动转换它,这就是为什么您最后会收到 5 位时区代码。

于 2012-08-01T23:12:23.203 回答