ruby – ActiveSupport :: TimeWithZone #to_date返回错误的日期

ruby – ActiveSupport :: TimeWithZone #to_date返回错误的日期,第1张

概述我想要一个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上运行 任何人 我想要一个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的实例)获取日期(日期实例)部分

编辑:
有人在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返回错误的日期所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1267124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存