例如,如果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的实例)获取日期(日期实例)部分
编辑:
有人在http://pastebin.com/sn8ExZiQ也遇到同样的问题
注意: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 Railsgem "ruby-units" # Loads first and then rails is loadedgem "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时区的当前时间是
星期三,2012年4月11日10:12:17 UTC 00:00由ActiveSupport :: TimeWithZone表示
实例.
当我们执行< TimeWithZone> .to_date时,从rails应用程序返回
2012-04-10的日期不正确.
涉及上述错误行为的罪魁祸首是to_date方法的实现
由ruby-units gem提供
以下是演示上述错误行为的示例程序. 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) endendtdt = TestDT.newutc_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.rb2012-04-10
解:
>从Gemfile中删除ruby-units gem或在rails gem之后加载它>解决方法:使用datetime.to_s.to_date,而不是执行datetime.to_date
总结以上是内存溢出为你收集整理的ruby – ActiveSupport :: TimeWithZone #to_date返回错误的日期全部内容,希望文章能够帮你解决ruby – ActiveSupport :: TimeWithZone #to_date返回错误的日期所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)