如何让Ruby解析时间,好像它处于不同的时区?

far*_*adf 41 ruby timezone

我正在解析这样的事情:

11/23/10 23:29:57
Run Code Online (Sandbox Code Playgroud)

它没有与之相关的时区,但我知道它在UTC时区(虽然我不是).我怎样才能让Ruby解析它,就像它在UTC时区一样?

mae*_*ics 42

您可以在解析之前将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
Run Code Online (Sandbox Code Playgroud)

  • 这不可能是最好的一般案例解决方案 (10认同)
  • 在我的情况下不起作用.`s ="Fri Dec 3 17:05:41 2010 UTC"`将被解析为当地时间并忽略尾随的"UTC" (5认同)

Pet*_*umm 21

如果您使用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
Run Code Online (Sandbox Code Playgroud)

它旨在根据用户时区将时区设置在请求的开头.

一切都需要有Time.zone,所以Time.parse仍然会解析为服务器时区.

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

注意:您上面的时间格式不再有效,因此我更改为支持的格式.

  • 如果您不想更改整个Time.zone上下文,请使用ActiveSupport :: TimeZone.new('UTC').解析 (51认同)
  • 使用ActiveSupport :: TimeZone,您甚至可以使用块(与@jerph答案相同):`Time.use_zone('UTC'){Time.zone.parse('Tue Nov 23 23:29:57 2010')} ` (4认同)

new*_*cpp 16

信用来自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
Run Code Online (Sandbox Code Playgroud)


Bre*_*aub 9

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

ActiveSupport::TimeZone["GMT"].parse("..... date string")
Run Code Online (Sandbox Code Playgroud)


Cim*_*imm 5

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

require "time"

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


jBi*_*lbo 5

没有 Rails 依赖:Time以本地时间解析,但DateTime以 UTC 解析。Time然后,如果您想要的话,可以将其转换为一个类:

require 'date'

DateTime.parse(string_to_parse).to_time
Run Code Online (Sandbox Code Playgroud)