ruby-on-rails - 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 问题?
解决方案
动态默认值的正确语法使用 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 中的不同日期。
推荐阅读
- android - 将 json 中的 ID 和名称与 itemclicklistener 关联?
- android - 在另一个 recyclerView 中添加 recyclerView
- wordpress - Bitnami / EC2 WordPress 插件的权限
- html - 袖口列表内的袖口列表
- android - 单击一个 recyclerView 项目将我带到活动的顶部
- sql-server - 在执行过程中中断与 SQL Server 的连接
- cordova - 如何在 aurelia 中做特定平台?
- c++ - `unique_lock`、`scoped_lock` 和 `lock_guard` 中指定的 mutex_type 的用例是什么?
- css - 如果在屏幕上垂直和水平居中,居中 DIV 的顶部会出现剪切问题
- javascript - 使用 window.speechSynthesis 可以改变发音吗?