弄清楚了。特别感谢 @MarkLakata 指出 PDT 和 PST 之间的区别。事实证明,我们不能依靠这些来玩日期。在我的应用程序中,我确实知道我的财产的地理位置。目前,它是“太平洋时间(美国和加拿大)”,但稍后我可能会拥有许多其他地方的房产。我想安排将来的清洁工作。在现实世界中,人们通常不会围绕 DST 重新安排时间。因此,如果我说我在下午 4:15 做某事,我的意思是无论是否是 DST,我需要我的应用程序以相同的方式运行。
property.timezone
=> "Pacific Time (US & Canada)"
Time.zone = property.timezone
=> "Pacific Time (US & Canada)"
time = Time.zone.parse("2013-12-08 04:15pm").utc
=> 2013-12-09 00:15:00 UTC
time = Time.zone.parse("2013-10-08 04:15pm").utc #DST
=> 2013-10-08 23:15:00 UTC
我将 clean_date 属性存储在 Heroku 上的 PostgreSQL DateTime 字段中。我从属性中知道时区,所以我可以在从前端解析它后保存它。
property.update(:cleaning_time => time)
要从数据库中取回它,我只是这样做:
def cleaning_date_string
self.cleaning_time.in_time_zone("Pacific Time (US & Canada)").strftime("%m/%d/%Y")
end
def cleaning_time_string
self.cleaning_time.in_time_zone("Pacific Time (US & Canada)").strftime("%l:%M%P")
end
不幸的是,这是我发现在数据库中保存精确时间并以完全相同的方式检索它的唯一方法。这似乎在本地和 Heroku 上有效。
另外:
这似乎是线程安全的,根据:
在请求期间设置 Time.zone:线程安全?