Rails 3 ActiveRecord Time.now问题

时间:2012-05-08 10:41:20

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有 Rails 3.0.9
Activerecord-sqlserver-adapter 3.0.15
TinyTds
MSSQL 2005

我在使用Time.now时遇到问题 这就是我在控制台中所做的事情:
有人可以解释这种行为吗?

    irb(main):026:0> row = Eclaim.where(:id => 1).first
    => #<Eclaim id: 1, id_user: 1, property: "inv", app_number: nil, patent_number:
    nil, native_number: nil, title: nil, applicants: nil, receive_date: nil, change_
    date: "2012-05-08 10:20:44">

    irb(main):027:0> row[:change_date] = Time.now
    => 2012-05-08 13:37:13 +0300

    irb(main):028:0> row.save
    => true

    irb(main):029:0> row = Eclaim.where(:id => 1).first
    => #<Eclaim id: 1, id_user: 1, property: "inv", app_number: nil, patent_number:
    nil, native_number: nil, title: nil, applicants: nil, receive_date: nil, change_
    date: "2012-05-08 10:37:13">

    irb(main):047:0> Time.zone
    => (GMT+00:00) UTC

为什么我在数据库中输入日期 2012-05-08 10:37:13 而不是 2012-05-08 13:37:13 +0300

3 个答案:

答案 0 :(得分:3)

我找到了解决方案:
application.rb中,您应该编写以下设置:

config.time_zone = 'Riga'
config.active_record.default_timezone = :local

答案 1 :(得分:0)

我不是约会专家,但如果你改成像这样的话,会发生什么呢?

> row[:change_date] = Time.now.localtime

> row.save

我认为这会给出正确的结果。至于为什么会发生这种情况(我的2美分):

应始终将日期存储在某些标准中(人们似乎对于什么格式不同)。但是请注意,当存储时间为utc时,您需要将时间显示为本地时间(轻松完成)。在上面的示例中,rails会自动转换为utc并存储它。希望它有所帮助

修改

Rails我认为仍默认为utc时间(不知道如何更改)。但是从数据库中的utc时间你可以调用localtime。如果你调用这个

会发生什么
Eclaim.first.change_date.localtime

这是我可以考虑从存储在数据库中的utc获取本地时间的唯一方法。

答案 2 :(得分:0)

ActiveRecord以UTC(以前称为GMT)存储日期。格式化日期时,它会将日期转换回本地时区。在Eclaim.where(:id =&gt; 1)之后。首先,执行row.change_date。

irb(main):029:0> row = Eclaim.where(:id => 1).first
irb(main):029:0> row.change_date