首页 > 解决方案 > Mongoid 1.month.ago 将在 3 月 1 日返回 01

问题描述

我有一个 ROR 应用程序:ruby 2.3.0、rails 4.2.5.1 和 mongoid 5.0,在我的一个模型中,我有: field :statement_month, default: 1.month.ago.strftime('%m') ,但只有在 3 月 1 日,它保存了一个错误的结果: "01" 而不是 "02" 。在每个月的第一天,其他月份我都没有问题。我还添加了一些日志, before_create 和 after_create ,打印: "-------1_month_ago_month------------" + 1.month .ago.strftime('%m') => 在日志中显示“02”,但在 DB 对象中为“01”。这是一个 mongoid 问题,还是 TimeZone 问题?

标签: ruby-on-railsmongoid

解决方案


动态默认值的正确语法使用 Procs。请参阅https://docs.mongodb.com/mongoid/master/tutorials/mongoid-documents/#defaults

MongoDB 将时间存储为 UTC 时间戳,您的程序不会显式转换为 UTC,因此它 1) 可能在时区方面表现不佳,以及 2) 在夏令时方面可能表现不佳。日期数学通常必须在本地时间(并且您应该知道您所在的时区)或 UTC 中明确执行。将两者混合最终会导致问题。

要排除错误月份的故障,请将系统时间设置为 3 月 1 日并调试程序。特别是,请尝试 3 月 1 日 01:00 和 3 月 1 日 23:00。对于同一本地日期,这些通常是 UTC 中的不同日期。


推荐阅读