我有一个带日期时间属性的project
模型来定义截止日期。截止日期为不同的时区,我接受他们的字符串格式如下图所示:Rails:不同时区的日期时间
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
模型来定义截止日期。截止日期为不同的时区,我接受他们的字符串格式如下图所示:Rails:不同时区的日期时间
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
通知的+3:00hrs
为用于获取结果到我的EST时区的时间戳。
要获得每个时间戳的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
谢谢!所以我只需要设置'@deadline = Time.parse('Jan 1st 2013 00:00:00 EST')。utc'并将它保存到我的数据库中,对不对? –
你可以通过尝试**,切尔西获得很多问题的答案。将'Time.now.zone'放入控制台并查看它返回的内容。下面你的问题的答案是**是**,'Time.now'默认使用Rails配置的时区。 – deefour
至于将其保存到数据库中,Rails会自动将时间戳转换为UTC,然后将其存储到数据库中,并在返回到配置的时区时拔出。只要'@ deadline'是一个有效的'Time'实例,它将在存储它之前将'EST'时间转换为'UTC'。 – deefour
我是新手,对我来说这似乎很神奇!顺便说一下,在我的'项目'模型中,我有一个名为'is_emergent?'的方法,它将'Time.now'与'project.deadline'进行比较,在我的视图文件中,我有一个页面显示所有紧急项目。问:1)'Time.now'是否也使用默认的配置时区? 2)页面是否显示观看者时区格式的截止日期,或者我需要使用一些js来检索用户的本地时区? –
1)当比较两次时,时区不会影响结果。你可以通过'Time.zone.now'或'Time.now'获得当前时间。两者都应该没问题。 2)页面默认显示配置时区的截止日期。你可以用'deadline.in_time_zone(...)'来转换时区。 – Yanhao
很明显。谢谢! –