Rails:不同时区的DateTime

时间:2012-12-18 12:53:38

标签: ruby-on-rails datetime

我有一个带有datetime属性的project模型来定义截止日期。截止日期是不同的时区,我收到的字符串格式如下:

Jan 1st 2013 00:00:00 EST
Feb 9th 2013 23:59:00 PST

我想在数据库中以默认的UTC格式存储这些值。我已经看到有很多选项来解析时间,例如Time.zone.parseTime.parse。我的问题是:解析不同时区的日期时间的最佳做法是什么?我正在使用Rails 3.2.9

2 个答案:

答案 0 :(得分:1)

只要您在config/application.rb中设置正确的时区,就不必担心这一点:

config.time_zone = 'UTC'

您只需将时间字符串分配给属性,ActiveRecord就会正确转换它。

1.9.3p125 :002 > project.deadline = "Jan 1st 2013 00:00:00 EST"
 => "Jan 1st 2013 00:00:00 EST" 
1.9.3p125 :003 > project.deadline
 => Tue, 01 Jan 2013 05:00:00 UTC +00:00 
1.9.3p125 :004 > project.deadline = "Feb 9th 2013 23:59:00 PST"
 => "Feb 9th 2013 23:59:00 PST" 
1.9.3p125 :005 > project.deadline
 => Sun, 10 Feb 2013 07:59:00 UTC +00:00 

ActiveRecord使用Time.zone.parse在内部解析字符串。

答案 1 :(得分:0)

当您运行Time.parse时,它会将时间戳转换为您在rails中配置的时区。例如,我的rails应用程序在EST中运行。

[5] pry(main)> Time.parse('Jan 1st 2013 00:00:00 EST')
=> 2013-01-01 00:00:00 -0500
[6] pry(main)> Time.parse('Feb 9th 2013 23:59:00 PST')
=> 2013-02-10 02:59:00 -0500

请注意+3:00hrs用于将结果输入我的EST时区的PST时间戳。

要获取每个时间戳的UTC版本,只需致电utc

[7] pry(main)> Time.parse('Jan 1st 2013 00:00:00 EST').utc
=> 2013-01-01 05:00:00 UTC
[8] pry(main)> Time.parse('Feb 9th 2013 23:59:00 PST').utc
=> 2013-02-10 07:59:00 UTC