Ruby on rails Mongoid 1.month.ago将于3月1日返回01

Ruby on rails Mongoid 1.month.ago将于3月1日返回01,ruby-on-rails,mongoid,Ruby On Rails,Mongoid,我有一个ROR应用程序:ruby 2.3.0、rails 4.2.5.1和mongoid 5.0,在我的一个型号中,我有: 字段:statement\u month,默认值:1.month.ago.strftime“%m”,但仅在3月1日保存错误结果:01而不是02。 在这个月的第一天,我的其他月份都没有问题。 我还添加了一些日志,在创建前和创建后打印: ----1个月前-----+1.month.ago.strftime“%m”=>在日志中显示02,但在DB对象中显示01。这是一个mongoi

我有一个ROR应用程序:ruby 2.3.0、rails 4.2.5.1和mongoid 5.0,在我的一个型号中,我有: 字段:statement\u month,默认值:1.month.ago.strftime“%m”,但仅在3月1日保存错误结果:01而不是02。 在这个月的第一天,我的其他月份都没有问题。 我还添加了一些日志,在创建前和创建后打印:
----1个月前-----+1.month.ago.strftime“%m”=>在日志中显示02,但在DB对象中显示01。这是一个mongoid问题,或者可能是时区问题?

动态默认值的正确语法使用Procs。看

MongoDB将时间存储为UTC时间戳,您的程序不会显式转换为UTC,因此它在时区方面有1个潜在错误,在夏令时方面有2个潜在错误。日期数学通常必须在当地时间明确执行,并且您应该知道您所在的时区或UTC。两者混合最终会导致问题


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

解决方案是将旧代码从:field:statement\u month,默认值:1.month.ago.strftime“%m”更改为field:statement\u month,默认值:->{Time.now-1.month.strftime“%m”}