2

我的应用程序在“雅典”(希腊)时区运行。标准偏移量是“+02:00”。但是,在夏季,雅典有 DST,这意味着一年中特定时期的偏移量变为“+03:00”。而且这些时期不是标准的。他们改变。

给定一个字符串“20YY-MM-DDTHH:MI:SS”,它代表“雅典”时区的日期时间,我希望能够使用“+02:00”或“+”将其转换为正确的 DateTime 实例03:00" 偏移量。

因此,例如,字符串“2013-04-11T20:28:07”实际上是“2013-04-11T20:28:07+03:00”,而字符串“2013-11-11T20:28:07”实际上是“2013-11-11T20:28:07+02:00”。

考虑到时区和日期时间规范缺少实际偏移量,我是否有任何 Rails/Ruby 代码可以帮助我找出正确的偏移量?

4

4 回答 4

3

我认为您需要TZInfo库(此处为 gem)。该库使用IANA TimeZone 数据库中指定的时区名称。此数据库包含指定每个时区的偏移量的规则,由名称指定。每当规则更改时,数据库都会定期更新。

使用简单的时区偏移量来确定时区是不够的。偏移量可以简单地通过改变基线偏移量、日期甚至时间从夏季时间切换到冬季时间的法律来改变。例如,莫斯科在过去 4 年中至少更改了两次时区。

一个更好的解决方案,如果你使用 Rails,是使用in_time_zone,正如 Stefan 所说

于 2013-11-01T15:33:18.253 回答
2

这似乎有效:

Time.parse('2013-04-11T20:28:07').in_time_zone('Athens').utc_offset
#=> 10800

Time.parse('2013-11-11T20:28:07').in_time_zone('Athens').utc_offset
#=> 7200
于 2013-11-01T15:31:43.713 回答
2

http://www.ruby-doc.org/core-1.9.3/Time.html

夏令时?→ true 或 false 如果时间发生在其时区的夏令时期间,则返回 true。

所以如果你做 Time.local(YYYY, M, D).dst?
并且它确实表明该 DateTime 行的时间落在夏令时..

于 2013-11-01T15:27:59.397 回答