我有一个包含三个字段的表单:
用户希望为其他国家/地区的客户安排任务,即在另一个时区。所以,他将填写表格:
I want this task to be executed at 12/08/2015, at 15:00 in London time zone
我有这三个参数,我不介意用户现在在哪里或者他来自哪里。我只想在UTC日期转换这三个字段信息。
如何在唯一的UTC日期转换此字段?
答案 0 :(得分:3)
要明确获取特定的TimeZone
个实例,请使用ActiveSupport::TimeZone::[]
并致电ActiveSupport::TimeZone#parse
以在该时区内创建TimeWithZone
个实例:
time = ActiveSupport::TimeZone['London'].parse('12/08/2015 15:00')
#=> Wed, 12 Aug 2015 15:00:00 BST +01:00
或使用ActiveSupport::TimeZone#local
:
time = ActiveSupport::TimeZone['London'].local(2015, 8, 12, 15, 0)
#=> Wed, 12 Aug 2015 15:00:00 BST +01:00
调用TimeWithZone#utc
以UTC格式返回Time
个实例:
time.utc
# => 2015-08-12 14:00:00 UTC
ActiveSupport还提供Time::use_zone
在块内设置Time.zone
:
Time.use_zone('London') { Time.zone.parse('12/08/2015 15:00') }
#=> Wed, 12 Aug 2015 15:00:00 BST +01:00
请注意,ActiveRecord会自动以UTC格式保存DATETIME字段,因此通常无需将时间转换为UTC。
答案 1 :(得分:2)
此外,此方法也不依赖于ActiveSupport。
Time.zone = time_zone
time_to_utc = Time.zone.parse('time').utc
例如:
Time.zone = "London"
time_to_utc = Time.zone.parse('08/07/2015 00:00').utc
我希望这能解决你的问题。
答案 2 :(得分:1)
Time.use_zone('London') { Time.zone.parse('07/08/2015 17:00') }.utc
即使这可以按预期使用单行。
答案 3 :(得分:0)
ActiveSupport::TimeZone['Pacific Time (US & Canada)'].parse(params[:created_at])