我创建了多个具有不同scheduled_on
属性的调度对象。例如,每个对象都有一个登陆日期,即每月第一天下午 4:00。
一旦其中一个对象命中时区更改。该应用程序智能地提前或落后一小时对其进行配置,使其相对于其父时区。
问题是应用程序会将对象保存为下午 4:00(太平洋标准),这些时间最终将显示为(PDT 或提前一小时或下午 5:00)。这意味着我需要它在 UTC 中节省一个小时的休息时间,以便当时间到来时,无论我们处于哪个时区,它都会显示为下午 4 点。
在 Rails 中确保这一点的最佳技术是什么?
我将通过指出一些关于在 Rails 中添加与时区相关的时间的好东西来回答这个问题。
添加时间时,尽管时区更改,但时间将以 UTC 格式分配以保持相同的时间:
t = Time.now
-> 2012-08-10 13:17:01 +0200
t + 90.days
-> 2012-11-08 13:17:01 +0100
日期时间不会这样做。日期时间在它开始的同一时区中将上升一小时或减少一小时:
dt = DateTime.now
=> Fri, 10 Aug 2012 13:16:54 +0200
dt + 90.days
=> Thu, 08 Nov 2012 13:16:54 +0200
但是日期时间是获取两个日期之间的天数的唯一方法,您可以通过减去两个日期时间来做到这一点。这个,你不能用时间做,因为当减去一个时间时,它不会除以一个完美的24小时,你会因为时区切换而得到一个无理数。
这是特定于我的问题。但是我通过将我的时间转换为日期时间来查找距离中的天数,然后重新转换回时间以查找相对于时区更改的 UTC 中较晚的时间来解决我的问题:
original_job.to_time + ( new_date.to_datetime - original_job.to_datetime ).to_i.days