加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:01:34 所属栏目:百科 来源:网络整理
导读:我想要一个ActiveSupport :: TimeWithZone实例的日期部分.我使用了to_date函数,但它提前一天返回日期. 例如,如果datetime是2012-04-11 09:05:00 UTC,如果我调用to_date,则返回2012-04-10但2012-04-11. 我也没有使用特定的时区(默认为UTC) 该应用程序在Ruby 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上运行

任何人都可以告诉我为什么它给错了日期?另请建议我是否有更好的方法从给定的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 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时区的当前时间是
星期三,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)
 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读