【问题标题】:Why does Time.now.today? return false in my Rails 4 application?为什么是 Time.now.today?在我的 Rails 4 应用程序中返回 false?
【发布时间】:2016-05-16 03:15:23
【问题描述】:

现在是 2016 年 2 月 5 日东部标准时区(美国)晚上 8:04。

当我运行这个命令时

Time.now.today?
#=> false

它返回 false。

为什么,我该如何纠正?谢谢。

详情:

  • Rails 4.0.0
  • Ruby 2.2.1p85
  • Mac OS X El Capitan

【问题讨论】:

  • 核心Ruby中没有Time#today?这样的方法。
  • 有趣,这是在一个 Rails 项目中。所以我会添加标签.......是的,刚刚确认了它的rails方法。将在github上提交一个问题,但我确定有一些配置设置我可以更改以暂时更正它
  • Time.zone 返回什么? Date.today 怎么样?
  • 好奇怪。 Date.today 返回“Fri, 05 Feb 2016”,但 Time.zone 返回预期的 #<ActiveSupport::TimeZone:0x007fbc0c1c58c0 @name="UTC", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Etc/UTC>, @current_period=nil> (UTC)

标签: ruby-on-rails ruby ruby-on-rails-4 time activesupport


【解决方案1】:

也许您的 Rails 应用程序已配置(在 config/application.rb 或 config/environments/*.rb 中)

config.time_zone = 'UTC'

而您的 Mac 在 EST 中,反之亦然。将我方便的 Rails 4.1 应用程序的时区设置为'UTC' 为我重现了这个问题。

如果是这样,则出现差异是因为在您运行命令时,UTC 日期比您的时区晚一天。

【讨论】:

  • 当然在 rails 4.0 级别我的应用根本没有配置!
  • 已确认(方便地是 2 天后的晚上 8:24),将 config.time_zone = 'EST' 添加到 application.rb 可以防止错误。谢谢!
【解决方案2】:

我认为您的问题可能是时区设置。当您在8:04PM EST(即1:04AM UTC)运行此程序时,您的时区似乎设置为UTC,因此1:04AM UTC 是明天(Feb 6, 2016)。

我会检查您的config/application.rb 并尝试将您的时区更改为Eastern Time (US & Canada),从您上面的评论来看,它当前设置为UTC(默认)。

使用 (Eastern Time (US & Canada):

运行命令
Time.now
=> 2016-02-05 22:42:08 -0500
Time.now.today?
=> true
Date.today
=> Fri, 05 Feb 2016
Time.zone
=> #<ActiveSupport::TimeZone:0x007f9a1bcffd20 @name="Eastern Time (US & Canada)", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: America/New_York>, @current_period=#<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionDefinition: #<TZInfo::TimeOrDateTime: 1446357600>,#<TZInfo::TimezoneOffset: -18000,0,EST>>,#<TZInfo::TimezoneTransitionDefinition: #<TZInfo::TimeOrDateTime: 1457852400>,#<TZInfo::TimezoneOffset: -18000,3600,EDT>>>>

当我运行相同的命令时(UTC timezone):

注意Time.now.in_time_zone实际上是明天,因此Time.now.today? =&gt; false

Time.now
=> 2016-02-05 22:27:15 -0500
Time.now.today?
=> false
Time.now.in_time_zone
=> Sat, 06 Feb 2016 03:27:29 UTC +00:00
Date.today
=> Fri, 05 Feb 2016
Date.current.in_time_zone
=> Sat, 06 Feb 2016 00:00:00 UTC +00:00
Time.zone
=> #<ActiveSupport::TimeZone:0x007fa19313f7e0 @name="UTC", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Etc/UTC>, @current_period=#<TZInfo::TimezonePeriod: nil,nil,#<TZInfo::TimezoneOffset: 0,0,UTC>>>>

【讨论】:

    【解决方案3】:

    经常让人困惑的一件事是Time.nowTime.current 是完全不同的对象。

    Time.now 原样返回 Ruby 库的 Time 类。它返回系统时间。

    Time.current 返回由 Rails ActiveSupport 库修改的时间。它返回由 Rails time_zone 设置修改的系统时间。

    today?方法在ActiveSupport::TimeWithZone中声明,它根据Time.current而不是Time.now判断给定对象的时间是否为今天。

    因此,如果您的 Time.nowTime.current 的日期不同,则调用 Time.now.today? 将返回 false。

    如果两者都代表同一天,Time.now.today? 将返回 true。

    Time.current.today? 应该总是返回 true。

    除了一些特殊情况,最好避免Time.now,在Rails 中一直使用Time.current

    【讨论】:

      【解决方案4】:

      纯ruby中没有Time#today?方法,是Rails引入的。由于 Rails 使用区域时间模型,我相信它会返回false,因为当前时间与UTC 有差距(当然应该为UTC 配置rails),以确保#today? 将始终返回@987654328 @,使用Time.zone构造,这样你会得到:

      Time.zone.now.today? # => true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-18
        • 2023-02-05
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多