0

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

一旦其中一个对象发生时区更改。该应用程序智能地提前或落后一小时对其进行配置,使其相对于其父时区。

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

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

4

1 回答 1

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 是获取两个日期之间天数的唯一方法,您可以通过减去两个 DateTimes 来做到这一点。这一点,你不能用时间来做,因为当减去时间时,它不会除以完美的 24 小时,因为时区切换,你会得到一个无理数。

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

original_job.to_time + ( new_date.to_datetime - original_job.to_datetime ).to_i.days
于 2012-08-10T11:26:39.610 回答