Ответ 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
Я разбираю что-то вроде этого:
11/23/10 23:29:57
у которого нет связанного с ним часового пояса, но я знаю его в часовом поясе UTC (пока я не знаю). Как я могу заставить Ruby проанализировать это, как если бы он находился в часовом поясе UTC?
Вы можете просто добавить имя часового пояса 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
Если вы используете рельсы, вы можете использовать помощники 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
Примечание: формат времени, указанный выше, больше не работает, поэтому я изменил формат, который поддерживается.
Алитер @Pete Brumm отвечает без установки Time.zone/unset
Time.zone.parse("Tue Nov 23 23:29:57 2010") + Time.zone.utc_offset