1

我有
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

4

3 回答 3

3

我找到了解决方案:
application.rb你应该写这样的设置:

config.time_zone = 'Riga'
config.active_record.default_timezone = :local
于 2012-05-08T11:56:40.507 回答
0

我不是日期专家,但是如果你像这样更改为 UTC 会发生什么

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

> row.save

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

人们应该始终以某种标准存储日期(人们似乎对那是什么格式有所不同)。但是请注意,当存储为 utc 时间时,您需要将时间显示为本地时间(很容易做到)。在上面的示例中,rails 会自动转换为 utc 并存储它。希望能帮助到你

编辑

我认为 Rails 仍默认为 UTC 时间(不知道如何更改)。但是,从数据库中的UTC时间开始,您可以调用localtime。如果您调用它会发生什么

Eclaim.first.change_date.localtime

这是我能想到的从存储在数据库中的 UTC 获取本地时间的唯一方法。

于 2012-05-08T10:55:34.047 回答
0

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

irb(main):029:0> row = Eclaim.where(:id => 1).first
irb(main):029:0> row.change_date
于 2012-05-08T10:57:53.130 回答