ruby – ActiveSupport :: TimeWithZone #to_date返回错误的日期
我想要一个ActiveSupport :: TimeWithZone实例的日期部分.我使用了to_date函数,但它提前一天返回日期.
例如,如果datetime是2012-04-11 09:05:00 UTC,如果我调用to_date,则返回2012-04-10但2012-04-11. 我也没有使用特定的时区(默认为UTC) 该应用程序在Ruby 1.8.7和Rails 3.0.2上运行 任何人都可以告诉我为什么它给错了日期?另请建议我是否有更好的方法从给定的DateTime(ActiveSupport :: TimeWithZone的实例)获取日期(日期实例)部分 编辑: 注意:Time.zone返回’UTC’ 解决方法
谢谢
Jignesh.在这里,我将分享您的发现和解决方案.
可能有一些gem覆盖了to_date实现,它可能被错误地实现,并且可能会调用这个被覆盖的版本. 在我的情况下,罪魁祸首是ruby-units gem 根本原因:应用程序的Gemfile中包含ruby-units 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时区的当前时间是 涉及上述错误行为的罪魁祸首是to_date方法的实现 以下是演示上述错误行为的示例程序. to_date方法与ruby-units gem实现的方法相同,只是在方法中添加了一个参数,即date_time,并且实现中的self被参数替换 示例Ruby程序以确认上述发现: require 'rubygems' require 'active_support/all' class TestDT def to_date(date_time) #x=(Date.civil(1970,1)+((self.to_f+self.gmt_offset)/86400.0)-0.5) x=(Date.civil(1970,1)+((date_time.to_f+date_time.gmt_offset)/86400.0)-0.5) Date.civil(x.year,x.day) end end tdt = TestDT.new utc_time = Time.now.in_time_zone('UTC') puts tdt.to_date(utc_time) 输出(撰写本文时的日期是星期三,2012年4月11日08:35:12 UTC 00:00): $ruby test_date_time.rb 2012-04-10 解: >从Gemfile中删除ruby-units gem或在rails gem之后加载它>解决方法:使用datetime.to_s.to_date,而不是执行datetime.to_date (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |