Rails:如何将日期时间字符串解析为特定时区

Mat*_*rtz 36 timezone ruby-on-rails date

我在Debian上使用Rails 3.2和ruby 1.9.3.我有一个应用程序,通过HTML表单以字符串的形式收集日期,时间和时区.像这样的东西:

start_date: "04-15-2010",
start_time: "10:00:00",
timezone: "Central Time (US & Canada)"
Run Code Online (Sandbox Code Playgroud)

我想要做的是将这3个元素解析为一个以UTC格式保存到我的数据库中的日期,在这种情况下,一旦它在UTC时区,就会增加7个小时到开始时间.因此,一旦它在数据库中作为UTC而不是收到的中央时间,存储的时间将是17:00.

我试过这样的东西来解析日期:

ActiveSupport::TimeZone[timezone].at DateTime.strptime("{ 2012-04-09 20:00:00 }", "{ %Y-%m-%d %H:%M:%S }").to_i
Run Code Online (Sandbox Code Playgroud)

但是,我无法将时区合并到%Z的结果时间中.它要么不解析,要么将时间解释为UTC而不是中心时间.所以我的问题是,如何在不改变存储的实际日期/时间值的情况下将日期字符串强制转换为某个时区.我希望能够将字符串解析成包括与它正确的时区的日期/时间对象在那个时候,这样未来的时区转换是准确的.我看了一遍,找不到办法做到这一点.这很奇怪,因为这似乎是从HTML表单输入的日期常见的事情.感谢您的任何帮助.

rya*_*ung 107

试试这个:

zone = "Central Time (US & Canada)"  

ActiveSupport::TimeZone[zone].parse("2013-04-03 17:47:00")
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了,但无论如何都要用strptime做到这一点?我的日期以特定格式出现,并且与.parse不兼容 (7认同)
  • 如果你已经有一个 `ActiveSupport::TimeZone` 的实例,那么你可以在它上面调用 `.strptime(str, format)` 来解析给定格式的日期字符串。 (2认同)

Art*_*jev 37

使用String#in_time_zone(Rails 4+)

我个人更喜欢使用String#in_time_zone:

>> '22.09.1986 10:30'.in_time_zone('Central Time (US & Canada)')
# => Mon, 22 Sep 1986 10:30:00 CDT -05:00
Run Code Online (Sandbox Code Playgroud)

这会将String中的日期和时间解析为提供的时区.

  • 这是最优雅的方式。谢谢。 (2认同)

0x4*_*672 18

%Z是指定时区名称的正确方法.你试过以下吗?

date_and_time = '%m-%d-%Y %H:%M:%S %Z'
DateTime.strptime("04-15-2010 10:00:00 Central Time (US & Canada)",date_and_time)
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,因为DateTime无法正确处理夏令时.如果我在4月15日上午10点输入DateTime.strptime,我会得到:2010年4月15日星期四10:00:00 -0600.它实际上应该是星期四,2010年4月15日10:00:00 -0500因为4月15日是CDT(中部夏令时),而不是CST(中部标准时间).使用ryancheung的答案以获得正确的结果:ActiveSupport :: TimeZone ["Central Time(US&Canada)"].parse("2013-04-03 17:47:00") (10认同)