1

Rails 3.0.9 Activerecord-sqlserver-adapter 3.0.15 TinyTdsMSSQL2005 を使用しています



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 13:37:13 +0300ではなく、データベースで2012-05-08 10:37:13の日付を取得するのはなぜですか?

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 に答える