【问题标题】:Why is `from_now` wrong when called on a Fixnum?为什么在 Fixnum 上调用 `from_now` 错误?
【发布时间】:2012-02-28 05:06:57
【问题描述】:

我需要在 yaml 文件中存储一些时间段,如下所示:

test:
testing: <%= 1.month %>

我像这样在初始化程序中获取数据:

Class::TIMES = YAML.load(ERB.new(File.new(Rails.root.join('config', 'times.yml')).read).result)

到目前为止一切顺利。但是我从中得到的时间总是差一天。测试表明了这一点。例如:

<Tue, 06 Mar 2012> expected but was <Wed, 07 Mar 2012>.

测试线:

assert_equal 1.month.from_now.to_date, @object.finished_at.to_date

在其他地方,@object 的 finished_at 设置如下:

# duration is from the YAML file
self.finished_at = duration.from_now

无论我在 YAML 文件中放入什么时间段,它似乎总是差了一天。为什么会这样?

编辑:这似乎是 Fixnums 和 from_now 的问题:

> 1.month.from_now
 => Tue, 06 Mar 2012 21:05:00 UTC +00:00 

> 1.month.to_i.from_now
 => Wed, 07 Mar 2012 21:05:05 UTC +00:00

【问题讨论】:

  • 您使用哪个时区进行测试?您应该在内部对所有值使用 UTC,并呈现到用户的本地时区以进行显示。
  • 它们都是 UTC。但我想我找到了真正的问题。我已经适当地编辑了我的问题。

标签: ruby-on-rails ruby testing yaml erb


【解决方案1】:

当您将 1.month 转换为整数时,它任意将传入 from_now 的持续时间设置为 2592000 秒,即 30 天,无论它是什么月份。

我之前遇到过这个问题。查看Data and Time Helper Methods 的文档。

虽然这些方法在使用时提供了精确的计算 上面的例子(“.. 1.month.from_now ..”),应该注意 如果months’,years' 等的结果为 使用前转换

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    相关资源
    最近更新 更多