Как заставить Ruby анализировать время, как если бы оно находилось в другом часовом поясе?

Я разбираю что-то вроде этого:

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

Ответ 2

Если вы используете рельсы, вы можете использовать помощники 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

Примечание: формат времени, указанный выше, больше не работает, поэтому я изменил формат, который поддерживается.

Ответ 3

Алитер @Pete Brumm отвечает без установки Time.zone/unset

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