我有一个project
带有 datetime 属性的模型来定义截止日期。截止日期是不同时区的,我以字符串格式收到它们,如下所示:
Jan 1st 2013 00:00:00 EST
Feb 9th 2013 23:59:00 PST
我想将这些值以默认的 UTC 格式存储在数据库中。我已经看到有很多选项可以解析时间,例如Time.zone.parse
和Time.parse
。我的问题是:解析不同时区的日期时间的最佳做法是什么?我正在使用Rails 3.2.9
.
我有一个project
带有 datetime 属性的模型来定义截止日期。截止日期是不同时区的,我以字符串格式收到它们,如下所示:
Jan 1st 2013 00:00:00 EST
Feb 9th 2013 23:59:00 PST
我想将这些值以默认的 UTC 格式存储在数据库中。我已经看到有很多选项可以解析时间,例如Time.zone.parse
和Time.parse
。我的问题是:解析不同时区的日期时间的最佳做法是什么?我正在使用Rails 3.2.9
.
只要您在以下位置设置正确的时区,您就不必担心这一点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
在内部解析字符串。
当您运行时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
请注意用于将结果放入我的 EST 时区+3:00hrs
的时间戳。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