4

のインスタンスから日付部分が必要ですActiveSupport::TimeWithZone。そのために関数を使用to_dateしましたが、1日前の日付を返します。

たとえば、datetime が2012-04-11 09:05:00 UTCの場合、呼び出すとbut がto_date返されます。2012-04-102012-04-11

また、特定のタイムゾーンを使用していません (デフォルトは UTC)

アプリケーションが実行されてRuby 1.8.7おり、Rails 3.0.2

日付が間違っている理由を教えてください。また、指定された(のインスタンスDate) 部分から日付 (のインスタンス)を取得するより良い方法があれば、私に提案してくださいDateTimeActiveSupport::TimeWithZone

編集:誰かがここでも同じ問題に直面していますhttp://pastebin.com/sn8ExZiQ

:Time.zoneリターン'UTC'

4

1 に答える 1

1

Jigneshに感謝します。ここで私はあなたの発見と解決策を共有しています。

実装をオーバーライドしているgemがありto_date、それが正しく実装されておらず、このオーバーライドされたバージョンが呼び出されている可能性があります。

私の場合、犯人はruby-units宝石でした

根本原因ruby-unitsアプリケーションのGemfileに含まれているgem

問題分析

Gemfile

# Ruby-units overrides String class #to method, hence placed before Rails
gem "ruby-units" # Loads first and then rails is loaded

gem "rails", "3.0.11"

..
..

time.rbファイル(ruby-units gem codebase)

..
..

unless Time.instance_methods.include?(:to_date)
    # :nocov_19:
    # @return [Date]
    def to_date
     x=(Date.civil(1970,1,1)+((self.to_f+self.gmt_offset)/86400.0)-0.5)
     Date.civil(x.year, x.month, x.day)
    end
    # :nocov_19:
end

..
..

UTCタイムゾーン の現在の時刻がインスタンスでWed, 11 Apr 2012 10:12:17 UTC +00:00表されているとしActiveSupport::TimeWithZone ます。Railsアプリケーションを実行すると、誤っ<TimeWithZone>.to_dateた日付が返されます。2012-04-10

上記の誤った動作に関与している原因は、gemto_dateによって提供されるメソッドの実装です。ruby-units

以下は、上記の誤った動作を示すためのサンプルプログラムです。このメソッドはgemto_dateによって実装されたものと同じですが、引数がメソッドに追加され、実装内のが引数'date_time'に置き換えられている点が異なります。ruby-unitsdate_timeself

上記の結果を確認するためのサンプルRubyプログラム:

require 'rubygems'
require 'active_support/all'

class TestDT
 def to_date(date_time)
     #x=(Date.civil(1970,1,1)+((self.to_f+self.gmt_offset)/86400.0)-0.5)
     x=(Date.civil(1970,1,1)+((date_time.to_f+date_time.gmt_offset)/86400.0)-0.5)
     Date.civil(x.year, x.month, x.day)
 end
end

tdt = TestDT.new
utc_time = Time.now.in_time_zone('UTC')
puts tdt.to_date(utc_time)

出力(これを書いている時点の日付は水でした11 Apr 2012 08:35:12 UTC +00:00):

$ ruby test_date_time.rb
2012-04-10

解決:

  1. ruby-unitsから宝石を削除するGemfileか、レールの宝石の後にロードします
  2. 回避策:実行する代わりにdatetime.to_datedatetime.to_s.to_date
于 2012-04-11T11:45:14.217 に答える