【问题标题】:Converting datetime with one timezone to utc将具有一个时区的日期时间转换为 UTC
【发布时间】:2014-05-27 23:01:29
【问题描述】:

在我的 rails4 应用程序中,我在两个字符串中给出了日期,一个给出了时间戳,而另一个给出了它所在的时区:

a = "04/23/2014 04:00"
b = "Eastern Time (US & Canada)"

我想将此日期转换为 UTC,以便我可以将其保存为 UTC

"2014-04-23 08:00:00 UTC"

最好的方法是什么?

【问题讨论】:

  • 使用.utc获取UTC格式的时间

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

使用Rails DateTime 类上的strptime 方法,您可以从包含时间和时区的字符串中解析DateTime 对象(时区通过%z 传递)指示)。从那里,您可以将时间转换为 UTC:

a = "04/23/2014 04:00"
b = "Eastern Time (US & Canada)"

datetime_with_tz = DateTime.strptime([a, b].join(' '), "%m/%d/%Y %H:%M %z")
#=> Wed, 23 Apr 2014 04:00:00 -0500

datetime_with_tz.utc
#=> Wed, 23 Apr 2014 09:00:00 +0000 

【讨论】:

  • datetime = DateTime.parse(a) 给出 ArgumentError: invalid date
  • @JVK,是的,这是日期字符串格式化方式的一个小问题。尝试使用strptime 来指定格式。我已经更新了我的答案以反映。
  • @JKV,看看我更新的答案。它通过从时间字符串解析 DateTime 对象来减少步骤 - 包括 timezone - 这使得能够从日期时间解析正确的 UTC 时间。
【解决方案2】:

使用 DateTime 类的 in_time_zone 方法

加载开发环境(Rails 2.3.2)

>> now = DateTime.now.utc
=> Sun, 06 Sep 2009 22:27:45 +0000
>> now.in_time_zone('Eastern Time (US & Canada)')
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00
>> quit

所以对于您的特定示例

a.in_time_zone('Eastern Time (US & Canada)')

【讨论】:

  • 你只是复制了这个答案from here。这就是为什么它说 Rails 2.3.2。 OP 正在寻求 Rails 4 中的解决方案。
  • 但是该操作也可以在 rails4 中运行,我没有尝试但我认为它必须有效。
  • a.in_time_zone('Eastern Time (US & Canada)') 给出 ArgumentError: argument out of range
猜你喜欢
  • 2019-08-31
  • 2016-09-28
  • 2012-08-06
  • 2015-11-13
  • 2016-06-17
  • 2022-12-17
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多