如何让 Ruby 解析时间,就好像它在不同的时区一样?

Posted

技术标签:

【中文标题】如何让 Ruby 解析时间,就好像它在不同的时区一样?【英文标题】:How do I get Ruby to parse time as if it were in a different time zone? 【发布时间】:2011-05-14 20:03:33 【问题描述】:

我正在解析这样的东西:

11/23/10 23:29:57

它没有与之关联的时区,但我知道它在 UTC 时区(而我不是)。如何让 Ruby 像在 UTC 时区一样解析它?

【问题讨论】:

【参考方案1】:

您可以在解析之前将 UTC 时区名称附加到字符串:

require 'time'
s = "11/23/10 23:29:57"
Time.parse(s) # => Tue Nov 23 23:29:57 -0800 2010
s += " UTC"
Time.parse(s) # => Tue Nov 23 23:29:57 UTC 2010

【讨论】:

噢!我实际上尝试过并误解了结果。我的错。谢谢。 在我的情况下不起作用。 s="Fri Dec 3 17:05:41 2010 UTC" 将被解析为当地时间并忽略尾随 UTC 这不可能是最好的通用案例解决方案 可能有效,但这不是好的工程实践。【参考方案2】:

如果您使用 Rails,您可以使用 ActiveSupport::TimeZone 助手

current_timezone = Time.zone
Time.zone = "UTC"
Time.zone.parse("Tue Nov 23 23:29:57 2010") # => Tue, 23 Nov 2010 23:29:57 UTC +00:00
Time.zone = current_timezone

它旨在根据用户时区在请求开始时设置时区。

所有东西都需要有Time.zone,所以Time.parse仍然会被解析为服务器时区。

http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

注意:你上面的时间格式已经失效了,所以我改成支持的格式了。

【讨论】:

如果您不想更改整个 Time.zone 上下文,请使用 ActiveSupport::TimeZone.new('UTC').parse @Jerph,你的答案绝对是最好的 @jerph 你的方法要好得多,而且实际上是线程安全的。 借助 ActiveSupport::TimeZone,您甚至可以使用块(与@jerph 回答相同):Time.use_zone('UTC') Time.zone.parse('Tue Nov 23 23:29:57 2010') 【参考方案3】:

在没有设置/取消设置 Time.zone 的情况下对@Pete Brumm 的回答进行修改

Time.zone.parse("Tue Nov 23 23:29:57 2010") + Time.zone.utc_offset

【讨论】:

【参考方案4】:

如果你使用 ActiveSupport [来自 Rails,例如],你可以这样做:

ActiveSupport::TimeZone["GMT"].parse("..... date string")

【讨论】:

【参考方案5】:

来自https://rubyinrails.com/2018/05/30/rails-parse-date-time-string-in-utc-zone/,

Time.find_zone("UTC").parse(datetime)
# => Wed, 30 May 2018 18:00:00 UTC +05:30

【讨论】:

为了记录,这需要 Rails(至少 ActiveSupport)【参考方案6】:

如果您不想/不需要加载 ActiveSupport,另一种纯 Ruby(无 Rails)解决方案。

require "time"

ENV['TZ'] = 'UTC'
Time.parse("2019/10/01 23:29:57")
#=> 2019-10-01 23:29:57 +0000

【讨论】:

这是迄今为止最好的答案。纯 Ruby,没有 fRails!谢谢!【参考方案7】:

没有 rails 依赖:Time 以当地时间解析,但DateTime 以 UTC 解析。然后,您可以将其转换为 Time 类,如果这是您想要的:

require 'date'

DateTime.parse(string_to_parse).to_time

【讨论】:

【参考方案8】:

Rails 在 datetime 对象上添加 utc 方法以返回 utc 时间:

Time.parse('10:10').utc

【讨论】:

这会将转换后的时间转换为utc,这不是要求的。

以上是关于如何让 Ruby 解析时间,就好像它在不同的时区一样?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 JSON 中的日期格式在 ruby 与 Swift 间保持一致

Python:如何将日期时间/时间戳从一个时区转换为另一个时区?

Rails:如何将日期时间字符串解析为特定时区

使用moment.js解析时如何忽略时区

如何在 Ruby 中更改 DateTime 的时区?

如何让 JavaScript 的 New Date() 函数在不同时区显示相同? [复制]