Mongoid 1.month.ago将在3月1日返回01

问题描述 投票:-1回答:1

我有一个ROR应用:ruby 2.3.0,rails 4.2.5.1和mongoid 5.0,在我的一个模型中,我有:字段:statement_month,默认值:1.month.ago.strftime('%m'),但仅在3月1日保存错误的结果:“ 01”而不是“ 02”。在本月的第一天,其他月份我都没有问题。我还添加了一些日志,before_create和after_create,打印:“ ------- 1_month_ago_month ------------------------” + 1.month.ago.strftime('%m')=>在日志中显示“ 02”,但在数据库对象中显示“ 01”。这是一个小问题,或者是一个TimeZone问题?

ruby-on-rails mongoid
1个回答
0
投票

动态默认值的正确语法使用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中同一本地日期的不同日期。

© www.soinside.com 2019 - 2024. All rights reserved.