【问题标题】:Why Ruby's strftime is rounding up the date?为什么 Ruby 的 strftime 会四舍五入日期?
【发布时间】:2020-12-07 09:51:07
【问题描述】:

我有一个 Ruby on Rails 项目。假设我的数据库中有一个表items,其中有一列名为expiry_date

考虑items 表中的这两条记录:

  1. id: 1, expiry_date: 2020-12-25 23:29:00(假设我将它作为 ActiveRecord 对象加载到实例变量 @item_one
  2. id: 2, expiry_date: 2020-12-25 12:29:00(假设我将它作为 ActiveRecord 对象加载到实例变量 @item_two

为什么strftime 方法给了我这个(我希望他们都评估为25 December 2020

@item_one.expiry_date.strftime('%-d %B %Y') 计算结果为 26 December 2020 @item_two.expiry_date.strftime('%-d %B %Y') 计算结果为 25 December 2020

【问题讨论】:

  • 看起来像带有时区的东西。可能非时区到期日期在它被 strftimed 之前被时区化。这只是一个猜测,您需要在问题中添加更多信息才能确定。
  • @item_one.expiry_date@item_two.expiry_date 的值是多少? (包括时区)
  • 时区 ???? -- 日期存储在哪个时区?您的服务器在哪个时区运行?
  • 顺便说一句,为什么名为expiry_date 的列有时间部分?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我终于明白了。

我机器的时区是 GMT+8。

我的问题中的日期直接取自数据库,当我strftimed 时,它会在时间部分增加 8 小时,从而将日期四舍五入。

【讨论】:

  • 当您将时间/日期写入数据库时​​,Rails 会将其转换为 UTC。同样,它在从数据库中读取时将其转换回您机器的时区。该转换发生在调用 strftime 之前 - 您的 @item_one.expiry_date 已经在 GMT+8 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多