2011-03-29 58 views
7

我有一个模型,用户和现场这样expires_at创建Rails3中的应用:如何使用rails3将本地时区的日期保存到db?

t.column :expires_at, :timestamp 

在我的数据库(PostgreSQL的),它具有类型:

timestamp without timezone 

问题是,当我打电话:

@user.expires_at = Time.now 
@user.save 

它被保存到UTC时区的数据库(我的本地时间是UTC + 1:00,华沙),但我不想那样。我只想把我的本地时区的时间保存到数据库中(2011-03-30 01:29:01.766709,而不是2011-03-29 23:29:01.766709)

我可以使用rails3来实现吗?

+1

小心!如果你有超过一个时区的用户,这会很快变得混乱。我更愿意将所有时间都保存为数据库中的UTC,并且只将它们转换为非UTC以便在客户端显示(您可以将时间从UTC转换为在用户操作系统中使用少量JavaScript设置的时区) 。祝你好运! – 2011-03-30 00:04:17

+0

当我从用户输入数据库查询呢? ActiveRecord会自动将它转换为UTC? – 2011-03-30 00:10:34

+0

这是一个很好的问题,但我怀疑它 - 它必须知道用户的时区才能够进行正确的转换。如果要将用户提供的日期存储为UTC,则可能必须将其转换为客户端(urgh)。我为我的客户端转换使用了[date.js](http://www.datejs.com/),但我只做了显示 - 我从未接受日期作为输入... – 2011-03-30 00:22:57

回答

10

对于本地时区节省时间数据库这有在application.rb中

config.active_record.default_timezone = :local 
+0

This doesn如果您正在使用Resque,则无法使用。不知道如何处理resque。 – Trip 2013-01-08 23:49:46

2

Rails documentation设置如果您只想对某些列使用本地时间,而不是作为一个全球性的设置,然后告诉我们这个:

# If your attributes are time zone aware and you desire to skip time zone conversion to the current Time#zone when reading certain attributes then you can do following: 

class Topic < ActiveRecord::Base 
    self.skip_time_zone_conversion_for_attributes = [:written_on] 
end 

(这也跳过了时区转换写作,而不只是阅读)。你可以传入多个属性的符号数组。

虽然我不确定引入了哪些版本的Rails。

+0

它在编写时似乎没有跳过时区(即它仍然转换为UTC),您如何检查它?当我通过'psql'查询时,我看到转换为UTC的所有值,而不是原来的时区。 – vemv 2016-02-07 01:27:25

+0

您还需要设置'config.active_record.time_zone_aware_attributes = false'来防止保存到数据库时转换为UTC – Turgs 2016-02-21 09:31:41

相关问题