如何在Rails中的特定时区中安排工作人员一段时间?

时间:2015-07-08 08:02:23

标签: ruby-on-rails ruby timezone utc

我有一个包含三个字段的表单:

  1. 日期
  2. 时间
  3. 时区
  4. 用户希望为其他国家/地区的客户安排任务,即在另一个时区。所以,他将填写表格:

    I want this task to be executed at 12/08/2015, at 15:00 in London time zone

    我有这三个参数,我不介意用户现在在哪里或者他来自哪里。我只想在UTC日期转换这三个字段信息。

    如何在唯一的UTC日期转换此字段?

4 个答案:

答案 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])

我认为这会奏效。