加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails-3 – 使用DateTime.strptime时未考虑Rails夏令时

发布时间:2020-12-17 02:35:47 所属栏目:百科 来源:网络整理
导读:我一直在研究解析字符串,我有一个测试用例,这对我来说一直是个问题.使用strptime解析日期/时间字符串时,不考虑夏令时.据我所知,这是一个错误.我找不到关于这个bug的任何文档.这是Rails控制台中的一个测试用例.这是 ruby 1.9.3-p215和Rails 3.2.2. 1.9.3-p125
我一直在研究解析字符串,我有一个测试用例,这对我来说一直是个问题.使用strptime解析日期/时间字符串时,不考虑夏令时.据我所知,这是一个错误.我找不到关于这个bug的任何文档.这是Rails控制台中的一个测试用例.这是 ruby 1.9.3-p215和Rails 3.2.2.

1.9.3-p125 :049 >   dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)","%Y-%m-%d %H:%M %Z")  
=> Sun,15 Apr 2012 10:00:00 -0600  
1.9.3-p125 :050 > dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)","%Y-%m-%d %H:%M %Z").utc  
=> Sun,15 Apr 2012 16:00:00 +0000  
1.9.3-p125 :051 > dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)","%Y-%m-%d %H:%M %Z").utc.in_time_zone("Central Time (US & Canada)")  
=> Sun,15 Apr 2012 11:00:00 CDT -05:00

正如你所看到的,我必须转换为utc然后回到时区才能正确解释DST,但随后时间也会移动一小时,所以它不是我从字符串中解析出来的.有人有这个错误的解决方法或更可靠的方法将日期时间时区可靠地解析到DateTime对象中,在该对象中正确表示夏令时吗?谢谢.

编辑:
好的,我找到了一个解决方法,虽然我不确定它有多强大.

这是一个例子:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse "2012-04-15 10:00"

这会将日期/时间字符串解析为正确的时区.我不确定解析方法对于处理这个问题有多强大,所以我想看看是否有更好的解决方法,但到目前为止这是我的方法.

解决方法

这是一个令人沮丧的问题.您正在寻找的Rails方法是Time.zone.parse.首先使用DateTime.strptime来解析字符串,然后通过Time.zone.parse运行它来设置区域.查看以下控制台输出:

> Time.zone
 => (GMT-06:00) Central Time (US & Canada) 
> input_string = "10/12/12 00:00"
> input_format = "%m/%d/%y %H:%M"
> date_with_wrong_zone = DateTime.strptime(input_string,input_format)
 => Fri,12 Oct 2012 00:00:00 +0000 
> correct_date = Time.zone.parse(date_with_wrong_zone.strftime('%Y-%m-%d %H:%M:%S'))
 => Fri,12 Oct 2012 00:00:00 CDT -05:00

请注意,即使Time.zone的偏移量为-6(CST),最终结果的偏移量为-5(CDT).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读