gpt4 book ai didi

ruby-on-rails - 更正 Rails DateTime.parse 中夏令时的时间

转载 作者:行者123 更新时间:2023-12-03 01:28:49 25 4
gpt4 key购买 nike

只是添加了数以百万计的有关时区和 DST 问题的问题。

我有一个带有单独日期和时间字段的表单,我将它们组合起来创建一个像这样的日期时间

start_time = DateTime.parse("#{parse_date(form_date)} #{form_start_time} #{Time.zone}")

如果我在 2012 年 8 月 21 日和 15:00 填写表单,那么这些就是我重新加载表单时看到的值。然后,如果我查看模型中的 start_time 属性,它会正确设置为 Tue, 21 Aug 2012 15:00:00 EST +10:00

如果我在今年晚些时候夏令时生效后使用日期(我在澳大利亚),就会出现我遇到的问题。如果我使用 2012 年 12 月 21 日和 15:00,然后检查 start_time,我会看到 Fri, 21 Dec 2012 16:00:00 EST +11:00

我对问题的解释是日期被保存在我当前的时区(+10:00)中,因为这是我告诉 DateTime.parse 要做的事情。然而,当返回该值时,Rails 会查看日期并说“嘿,现在是 12 月的夏令时”,并返回 +11:00 时区的时间。

我想要做的是告诉 DateTime.parse 在 DST 生效的情况下保存 +11:00 时区的时间。显然,将 Time.zone 传递到我的字符串中并不能实现这一点。有没有一种简单的方法可以做到这一点?我可以看到使用 Time#dst 执行此操作的方法吗?但我怀疑这会创建一些非常难看的复杂代码。我认为可能有一种我缺少的内置方式。

最佳答案

(Rails 4.2.4的答案,没有检查旧版本或新版本)

我建议使用以时区名称作为参数的 in_time_zone String 方法,而不是使用固定类次 +01:00、+02:00 等:

夏令时:

ruby :001 > "2016-07-02 00:00:00".in_time_zone('Paris')
=> Sat, 02 Jul 2016 00:00:00 CEST +02:00

冬季时间:

ruby :002 > "2016-11-02 00:00:00".in_time_zone('Paris')
=> Wed, 02 Nov 2016 00:00:00 CET +01:00

String#in_time_zone 相当于:

ruby :003 > Time.find_zone!("Paris").parse("2016-07-02 00:00:00")
=> Sat, 02 Jul 2016 00:00:00 CEST +02:00

ruby :004 > Time.find_zone!("Paris").parse("2016-11-02 00:00:00")
=> Wed, 02 Nov 2016 00:00:00 CET +01:00

您可以通过以下方式获取时区名称:

$ rake time:zones:all

或者在 Rails 控制台中:

ruby :001 > ActiveSupport::TimeZone.all.map(&:name)

或者为选择标签构建集合:

ActiveSupport::TimeZone.all.map do |timezone|
formatted_offset = Time.now.in_time_zone(timezone.name).formatted_offset
[ "(GMT#{formatted_offset}) #{timezone.name}", timezone.name ]
end

并存储时区名称而不是类次。

注意:不要混淆 String#in_time_zone 方法和 Time#in_time_zone 方法。

假设我的系统的时区是“巴黎”。

ruby :001 > Time.parse("2016-07-02 00:00:00")
=> 2016-07-02 00:00:00 +0200
ruby :002 > Time.parse("2016-07-02 00:00:00").in_time_zone("Nuku'alofa")
=> Sat, 02 Jul 2016 11:00:00 TOT +13:00

关于ruby-on-rails - 更正 Rails DateTime.parse 中夏令时的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056264/

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