gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:34:56 25 4
gpt4 key购买 nike

我一直在解析字符串,我有一个测试用例给我带来了问题。使用 strptime 解析日期/时间字符串时,不考虑夏令时。据我所知,这是一个错误。我找不到有关此错误的任何文档。这是 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"  

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

最佳答案

这是一个令人沮丧的问题。您正在寻找的 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)。

关于ruby-on-rails-3 - 使用 DateTime.strptime 时不考虑 Rails 夏令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10100456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com