Ruby on rails Rails:如何在postgres上创建带有时区的时间列

Ruby on rails Rails:如何在postgres上创建带有时区的时间列,ruby-on-rails,postgresql,timezone,utc,Ruby On Rails,Postgresql,Timezone,Utc,我有一个rails应用程序,可以在postgresdb上运行。我有一个名为UserTimings的模型,其中有两个字段,分别是从\u时间和到\u时间 t.time "from_time" t.time "to_time" 我希望时间将以完整的UTC格式存储,并带有时区信息。过了一会儿,我意识到数据库有这种SQL查询来创建表 from_time time without time zone, to_time time without time zone, 我不要这个。我想使用时

我有一个rails应用程序,可以在postgresdb上运行。我有一个名为UserTimings的模型,其中有两个字段,分别是从\u时间和到\u时间

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

from_time time without time zone,
to_time time without time zone,
我不要这个。我想使用时区存储。我想要UTC时间内的+0530,尽管rails应用程序已经配置好处理它,但我没有得到它。请告诉我如何编写迁移以强制db使用时区


谢谢。

您似乎对两个不同的问题感到困惑,这两个问题都是常见的错误,几乎每个人都会至少犯一个错误

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

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

没有时区的时间戳实际上不会给你一个时间,除非你也有一个地方。你不能比较其中的两个,除非你知道每一个都在哪个时区


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

迁移完全是你想要的

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
class CreatePeppers

类型由您选择。您可以在这里编写postgresql支持的任何类型。但是在转换为rails可以理解的类型时可能会出现问题。

不确定这是您想要的,但这对我很有用:

add_column :table, :from_time, :timetz
add_column :table, :to_time, :timetz
但rails似乎无法识别timetz类型,它将被视为字符串。为了解决这个问题,我将timetz注册为time

ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
  def initialize_type_map_with_postgres_oids mapping
    initialize_type_map_without_postgres_oids mapping
    register_class_with_limit mapping, 'timetz',
                              ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::Time
  end

  alias_method_chain :initialize_type_map, :postgres_oids
end

顺便说一句,我的环境是rails-4.2

这个railscast说我们的记录中必须有一个时区:字符串列。但是Postgres已经支持时区了!我怎样才能利用这个功能?我想要时间和时区。如何在rails迁移中指定专为postgres创建一个包含时区的时间列?那么要么你不理解我写的内容,要么你对问题的描述是错误的。我不知道定义或区别是什么。我被要求存储整个东西,时间和时区。我需要迁移来完成这项工作。有没有办法使用带时区选项的postgres时间列?如果是,教我怎么做。不,你不能。它不是这样做的。恐怕我看不出如何更清楚地向您解释细节。而且,在处理时间问题时,该链接可能会有所帮助。幸运的是,最新的SQLite似乎也支持“带时区的时间戳”