ruby-on-rails-3 – Rails在DST边界上为strftime提供了错误的时间

ruby-on-rails-3 – Rails在DST边界上为strftime提供了错误的时间,第1张

概述我有一个字符串“2014-03-15东部时间(美国和加拿大)”下午3:30,我想转换为DateTime并存储在我的数据库中. 这很简单: str = "3:30 PM 2014-03-15 Eastern Time (US & Canada)"event.starts_at = DateTime.strptime(str, "%l:%M %p %Y-%m-%d %Z") 这将创建具有正确时区的D 我有一个字符串“2014-03-15东部时间(美国和加拿大)”下午3:30,我想转换为DateTime并存储在我的数据库中.

这很简单:

str = "3:30 PM 2014-03-15 Eastern Time (US & Canada)"event.starts_at = DateTime.strptime(str,"%l:%M %p %Y-%m-%d %Z")

这将创建具有正确时区的DateTime.但是,如果我将事件保存到数据库,然后像这样读取它:

e.starts_at.in_time_zone("Eastern Time (US & Canada)")    .strftime("%l:%M %p") => #outputs 4:30 PM,when I want it to say 3:30 PM

输出给出了错误的时间(似乎是因为它正在调整DST)!我该怎么做才能解决这个问题?

解决方法 DateTime.strptime属于Ruby,而“Eastern Time(US& Canada)”等时区标识符仅由Rails通过 ActiveSupport::TimeZone提供.

简单来说,DateTime根本不理解该时区.您可以找到in the docs for DateTime,%z和%Z标记的定义如下:

Time zone:    %z - Time zone as hour and minute offset from UTC (e.g. +0900)            %:z - hour and minute offset from UTC with a colon (e.g. +09:00)            %::z - hour,minute and second offset from UTC (e.g. +09:00:00)            %:::z - hour,minute and second offset from UTC                                              (e.g. +09,+09:30,+09:30:30)    %Z - Time zone abbreviation name or something similar information.

%z定义有意义,但%Z定义是可笑的.它并没有真正说出允许或预期的内容.也许它正在寻找像“EST”或“EDT”这样的缩写,或者它可能会允许一些像“东方”这样的关键词.我真的不确定,但我认为它不太可能完全了解Rails的时区概念(这也是可笑的 – 见the timezone tag wiki的最底层).

从逻辑上讲,代码示例中发生的是在东部标准时间内解析值 – 即使东部夏令时在您通过的时间有效.只是一个猜测,但解析器中的某些东西可能正在“东部”并假设EST.然后使用-5偏移量将其保存在数据库中.当Rails加载它并使用一般的“东部时间(美国和加拿大)”时区处理它时,它意识到EDT有效的事实,因此它加载正确的-4偏移量.偏差的差异是你看到结果一小时的结果.

建议#1 – 放弃Rails时区标识符.请使用Ruby TZInfo gem,它可以为您提供正常的IANA time zone ID,例如America / New_York.

建议#2 – 如果必须使用Rails时区,则将它们与Rails中的Time.zone.parse结合使用,而不是DateTime.strptime.

(我不是特别流利的Ruby,或者我会给你一个例子.也许有人可以编辑我的回复来提供一个,或者提供一个回答他们自己.)

总结

以上是内存溢出为你收集整理的ruby-on-rails-3 – Rails在DST边界上为strftime提供了错误的时间全部内容,希望文章能够帮你解决ruby-on-rails-3 – Rails在DST边界上为strftime提供了错误的时间所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1276120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存