【问题标题】:DateTime comparison fails in Rails在 Rails 中日期时间比较失败
【发布时间】:2013-02-04 16:23:47
【问题描述】:

由于某种原因,比较总是失败,请从 Rails 控制台查看:

irb(main):021:0> @game.game_date.class
=> ActiveSupport::TimeWithZone
irb(main):026:0> @game.game_date
=> Tue, 19 Feb 2013 23:15:00 UTC +00:00
irb(main):022:0> @game.game_date.to_datetime
=> Tue, 19 Feb 2013 23:15:00 +0000
irb(main):019:0> DateTime.now
=> Tue, 19 Feb 2013 23:48:38 +0330
irb(main):020:0> @game.game_date.to_datetime > DateTime.now
=> true

为什么比较总是错误的?我也试过这个:

@game.game_date.to_time > Time.now.to_tim

结果也是 true ,但很明显,从 23:48 > 23:15:00 开始它应该是 false。

请注意,我在 ubuntu 和 Rails 3.1 下使用 ruby​​ ruby​​ 1.9.3p0

任何帮助将不胜感激

【问题讨论】:

  • @game.game_date.to_datetime > Time.zone.now 改为(使用您的时区)
  • 试过了,结果一样,没错。 Time.zone.now 给了我(2013 年 2 月 19 日星期二 20:47:24 UTC +00:00)和@game.game_date.to_datetime(2013 年 2 月 19 日星期二 23:15:00 +0000)
  • DateTime.now 给出您所在时区的时间。所以在这种情况下时区是+0330,这意味着当前的UTC时间将是Tue, 19 Feb 2013 20:18:38 +0000,它小于Tue, 19 Feb 2013 23:15:00 +0000
  • 你能推荐我如何处理它并将它与 DateTime.now 进行比较吗?或者如何设置一个新的时区就像 DateTime.now 结果一样,甚至无论如何都要以某种方式禁用时区?我只是希望结果以某种方式是错误的

标签: ruby-on-rails ruby ruby-on-rails-3 timezone


【解决方案1】:

您的时区有问题:

irb(main):022:0> @game.game_date.to_datetime
=> Tue, 19 Feb 2013 23:15:00 +0000
irb(main):019:0> DateTime.now
=> Tue, 19 Feb 2013 23:48:38 +0330

你看,你的 game_date 属性有一个+0000TimeZone,而 DateTime.now 有一个+0330

试试这个:

@game.game_date.to_datetime > Time.zone.now

【讨论】:

  • 同样的结果,真实,Time.zone.now 给了我(2013 年 2 月 19 日星期二 20:47:24 UTC +00:00)和 @game.game_date.to_datetime(2013 年 2 月 19 日星期二23:15:00 +0000)
  • 嗯,20:47 确实早于 23:15。不是吗?
  • 嗯,你说得对,但是我应该如何更改它,我的意思是设置时区?
  • 无论如何要禁用时区,我只需要结果 Time.zone.now = Time.now 不知何故,结果将是错误的
  • 试试Time.zone.now.to_s(:db)@EkiEqbal
【解决方案2】:

它对我有用,无论如何不确定它是否是最好的方法,但至少按我期望的方式工作:

@game.game_date.to_datetime > Time.now.to_datetime.change(:offset => "+0000") 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多