我的应用程序在"雅典"(希腊)时区上运行。标准偏移量为"+02:00"。但是,在夏季,雅典有夏令时,这意味着一年中特定时段的偏移量变为"+03:00"。这些时期不是标准的。他们变了。
给定一个字符串"20YY-MM-DDTHH:MI:SS",表示"雅典"时区的日期时间,我希望能够使用"+02:00"或"+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 代码可以帮助我找出正确的偏移量,因为时区和日期时间规范缺少实际偏移量?
我认为你需要 TZInfo 库(这里的 gem)。该库使用 IANA 时区数据库中指定的时区名称。此数据库包含指定每个时区偏移量的规则,这些偏移量由名称指定。每当规则更改时,数据库都会定期更新。
使用简单的时区偏移量来确定时区是不够的。只需通过一项法律来更改基线偏移量、日期甚至从夏令时切换到冬令时的时间,偏移量就可以改变。例如,莫斯科在过去4年中至少更改了两次时区。
如果你使用Rails,一个更好的解决方案是使用in_time_zone
,正如Stefan指出的那样。
似乎有效:
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
http://www.ruby-doc.org/core-1.9.3/Time.html
DST? →真是假如果时间发生在其时区的夏令时期间,则返回 true。
所以如果你做Time.local(YYYY, M, D).dst?
它给出了真的,然后那个日期时间行的时间落在夏令时..
我们的团队使用 ActiveSupport::TimeWithZone
(我们使用 Rails)
以下是一些支持参考:
- 日期
- 、时间和日期时间类是必需的吗?
- http://danilenko.org/2012/7/6/rails_timezones/
- http://www.elabs.se/blog/36-working-with-time-zones-in-ruby-on-rails
- http://viget.com/extend/protip-timewithzone-all-the-time
- http://www.betaful.com/2012/09/date-time-and-activesupporttimewithzone/
- http://railscasts.com/episodes/106-time-zones-revised?view=asciicast