Rails:如何在postgres上创建带时区的时间列

G S*_*mha 12 postgresql timezone ruby-on-rails utc

我有一个适用于postgres db 的rails应用程序.我有一个名为UserTimings的模型,其中有两个字段from_time和to_time.

t.time     "from_time"
t.time     "to_time"
Run Code Online (Sandbox Code Playgroud)

我预计时间将以完整的UTC格式存储,并带有时区信息.过了一会儿,我意识到数据库有这种SQL查询来创建表.

from_time time without time zone,
to_time time without time zone,
Run Code Online (Sandbox Code Playgroud)

我不想要这个.我想用时区存储.我希望UTC时间里有+0530的东西,我还没想到rails应用程序已被配置为处理它.请告诉我如何编写迁移以强制db使用时区.

谢谢.

Dim*_*tri 14

迁移完全符合您的要求

class CreatePeppers < ActiveRecord::Migration
  def change
    create_table :peppers do |t|
      t.column :runs, 'timestamp with time zone'
      t.column :stops, 'time with time zone'
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

类型供您选择.你可以在这里写任何类型,postgresql支持.但转换到类型可能存在问题,rails可以理解.


Ric*_*ton 5

你似乎对这里的两件不同的事情感到困惑——都是常见的错误,几乎每个人都至少犯过其中一个错误。

首先,“带有时区信息的 UTC 格式”没有指定时间。它指定时间和地点。

其次,PostgreSQL 的“带时区的时间戳”实际上并不存储时区。它存储一个 UTC 时间戳,但它接受一个时区。更好的名称选择类似于“绝对时间”。您可以直接比较其中的两个值。

没有时区的时间戳实际上不会给你时间,除非你也有一个地方。除非您知道每个所在的时区,否则您无法比较其中的两个。

听起来你想要的一个没有时区的时间戳和一个单独的时区。这样你就可以说“伦敦时间星期二下午 2 点”。

  • 我不知道定义或区别是什么。我被要求存储整个事情,时间和时区。我需要迁移才能做到这一点。有没有办法使用带有时区选项的 postgres 时间列?如果是,请教我如何。 (7认同)
  • 不,你不能。这不是它的作用。恐怕我不知道如何向你更清楚地解释细节。 (5认同)