如何在未来创建对象但忽略年度/年度TimeZone交换机?

时间:2012-08-09 18:25:59

标签: ruby-on-rails timezone

我创建了多个具有不同scheduled_on属性的计划对象。例如,每个对象都有一个日期,每个月的第一天下午4点到达。

一旦其中一个对象发生时区变化。该应用程序智能地将它配置为提前一小时或后面,以便它相对于其父级的时区。

问题是应用程序会将对象保存为下午4:00(在太平洋标准中),最终显示为(PDT或提前一小时或下午5:00)。这意味着我需要它在UTC中节省一个小时,以便在时间到来时,无论我们在哪个时区,它都将显示为下午4点。

什么是在Rails中确保这一点的最佳技术?

1 个答案:

答案 0 :(得分:1)

我将通过指出在Rails中增加与时区相关的时间的一些好事来回答这个问题。

当您添加时间时,尽管时区发生变化,时间仍以UTC分配以保持同一时间:

t = Time.now
-> 2012-08-10 13:17:01 +0200
t + 90.days
-> 2012-11-08 13:17:01 +0100

DateTime不会这样做。 DateTime将在它开始的同一个TimeZone中上升一小时或一小时:

 dt = DateTime.now
 => Fri, 10 Aug 2012 13:16:54 +0200 
 dt + 90.days
 => Thu, 08 Nov 2012 13:16:54 +0200

但是DateTime是获得两个日期之间的天数的唯一方法,您可以通过减去两个DateTime来完成。这个,你不能用时间,因为当减去一个时间时,它不会完全划分24小时,你会得到一个无理数因为的时区转换。

这是我的问题所特有的。但是我通过将Time to DateTimes转换为找到距离的天数来解决我的问题,然后重新转换回时间以找到相对于TimeZone更改的UTC时间:

original_job.to_time + ( new_date.to_datetime - original_job.to_datetime ).to_i.days