【问题标题】:How to schedule a worker for a time in an specific Time zone in Rails?如何在 Rails 的特定时区安排工作人员一段时间?
【发布时间】:2015-09-26 00:25:44
【问题描述】:

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

  1. 日期
  2. 时间
  3. 时区

用户希望在另一个国家/地区为他的客户安排任务,也就是说,在另一个时区。所以,他会填写表格告诉:

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

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

如何将这些字段转换为唯一的 UTC 日期?

【问题讨论】:

  • 输入总是有这种精确的格式吗?你的意思是他正在填写一个文本字段?最好有三个选择,或者一个 javascript 日期时间选择器 + 一个时区选择。
  • 表格是由三个选择组成的,是的。我没有解释这个,因为我认为回答这个问题无关紧要
  • 完全相关!从三个参数构建 UTC 时间与从您在问题中给出的完整句子构建它非常不同(并且更容易)。
  • 我很抱歉,也许问题不清楚。这里有一个深刻的解释:问题不是专注于前端。只是想知道有三个字段,在有效的上下文和最佳格式中。问题是关于如何将有效的 [date, hour, time_zone] 字段转换为 UTC 日期。我的意思是,是一个后端问题。我强调的文字应该被认为只是“用户故事”的一个例子。
  • 最好只显示问题中的参数:它与您的实际问题更相关,并且可以节省时间。

标签: ruby-on-rails ruby timezone utc


【解决方案1】:

要显式获取特定的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 会返回一个Time UTC 实例:

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 会自动将 DATETIME 字段保存为 UTC,因此通常无需将时间转换为 UTC。

【讨论】:

    【解决方案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
    

    我希望这能解决你的问题。

    【讨论】:

    • Time.zoneTime.zone= 是 ActiveSupport 方法。
    • 是的.. Time.zone 是一个可以读写的ActiveSupport 方法。
    【解决方案3】:

    Time.use_zone('London') { Time.zone.parse('07/08/2015 17:00') }.utc

    即使这在单行上也能按预期工作。

    【讨论】:

      【解决方案4】:

      ActiveSupport::TimeZone['Pacific Time (US & Canada)'].parse(params[:created_at])

      我认为这会奏效。

      【讨论】:

        猜你喜欢
        • 2023-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        相关资源
        最近更新 更多