【问题标题】:Date class returns same for today and tomorrow - Weird and Intriguing bug今天和明天的日期类返回相同 - 奇怪而有趣的错误
【发布时间】:2015-06-16 18:46:49
【问题描述】:

我们的 rspec 在晚上 12 点到 5 点之间出现了奇怪的行为,我们的测试正在下降。 (我住在印度,GMT + 5.30)

进一步检查,这是我看到的

rails c
Loading development environment (Rails 4.1.8)
[1] pry(main)> Date.yesterday
=> Thu, 09 Apr 2015
[2] pry(main)> Date.today
=> Sat, 11 Apr 2015
[3] pry(main)> Date.tomorrow
=> Sat, 11 Apr 2015
[4] pry(main)>

使用 Ruby 2.1 和 Rails 4.1.8

对我来说,似乎 Date.yesterday 和 Date.tomorrow 是根据 Date.current 计算的(没有时区,它被假定为 UTC)。 Date.today 的计算方式与当前时区图片不同。

这是否意味着我不应该使用没有明确时区的任何时间、日期。这难道不是完全错误的吗?

任何帮助将不胜感激

至少,我发现这是我们团队中某人的一个有趣发现

【问题讨论】:

  • 您在应用程序配置中设置的时区是什么?并跟进,为您的应用程序提供服务的机器使用哪个时区?

标签: ruby-on-rails ruby date


【解决方案1】:

如here 所述,Date.today 使用系统的本地时间。

在单元测试中,您应该模拟时间,但您应该在集成测试中标准化 UTC。你可以使用Time.now.utc.to_date 来做到这一点。 ActiveSupport 也可以帮到你。

【讨论】:

    【解决方案2】:

    所以我玩了一点,显然不难找到......

    现在,在我需要“日期”类之后,我在 irb 而不是 rails 控制台上做了同样的事情。事情只有 Date.today 存在,其他默认不存在,这意味着 Rails 必须包含它以满足我们的需要。

    我读了一些关于他们如何扩展 Date 类的内容,以为我会在 github/rails 上创建一个问题,但后来我偶然发现了这个 -:https://github.com/rails/rails/issues/12414

    总结一下,Date.today 应该替换为 Date.current ,所以这给出了

    [1] pry(main)> Date.today
    => Sat, 11 Apr 2015
    [2] pry(main)> Date.current
    => Fri, 10 Apr 2015
    

    只有 Date.today 不包括时区,Rails 的其他功能是.....不一致是出乎意料的,而且不好。

    【讨论】:

    • 我知道它并不完全直观,但是当您说“Date.today 不具有包容性...Rails 的 其他 函数”时,您揭示了核心问题是。”引用 Rails 中的 other 函数意味着 Date.today 是 Rails 中的一个函数。不是;它是 Ruby 中的一个函数。您只需要了解,在每个平台上,核心语言都具有某些功能并且自定义 3rd 方库以不同方式实现事物是很常见的。不过,在这种情况下,通过遵循在测试中使用日期的既定最佳实践可以缓解该问题。
    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多