Rails:时区之间的差异,以小时为单位

chr*_*ian 4 ruby time timezone ruby-on-rails

我希望能够说user1 is 4 hours ahead of user2,根据用户在其帐户中指定的时区计算.

使用以下代码:

time1 = Time.zone.now.in_time_zone(user1.time_zone)
time2 = Time.zone.now.in_time_zone(user2.time_zone)

distance_of_time_in_words time1,time2
Run Code Online (Sandbox Code Playgroud)

...给出了差异less than a minute- 同样减去两次给出的差异0.Rails显然仍然认为这两次是相同的.

知道如何计算两个时区之间的差异吗?

Rob*_*ert 5

如果您使用time1实例并对其进行调用utc_offset,您将获得与UTC的时间偏移量(以秒为单位).与此相结合utc_offsettime2,在一些减法扔,你应该得到秒的时间差.从那里你可以按照你喜欢的任何时间进行对话.

irb(main):020:0> time1 = Time.zone.now.in_time_zone("EST")
=> Sun, 09 Jun 2013 07:11:46 EST -05:00 
irb(main):021:0> time2 = Time.zone.now.in_time_zone("MST")
=> Sun, 09 Jun 2013 05:11:49 MST -07:00
irb(main):022:0> time_difference_in_seconds = time2.utc_offset - time1.utc_offset
=> -7200
irb(main):025:0> (time_difference_in_seconds/60/60).abs
=> 2
Run Code Online (Sandbox Code Playgroud)

  • 请注意您传入的实际区域.如果使用"EST"和"MST"等缩写,则忽略夏令时.您应该使用完整的rails区域ID,例如"Eastern Time(US&Canada)". (4认同)
  • 另外,不要忘记差异将高度依赖于"now"的确切值,因此不要保存此结果并假设这两个区域总是相隔X小时.每次需要时运行它 - 也许可以传递有问题的日期/时间,而不是依赖于`now`.请参阅[此视频](http://www.youtube.com/watch?v=84aWtseb2-4),特别是从3:57开始的部分. (3认同)