Как создать Ruby DateTime из существующего Time.zone для Rails?

У меня есть пользователи, входящие в даты на веб-сайте Ruby on Rails. Я анализирую даты в объекте DateTime с чем-то вроде:

date = DateTime.new(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i)

или

date = DateTime.parse(params[:date])

Оба DateTime будут не находиться в часовом поясе пользователя, который я ранее установил с чем-то вроде:

Time.zone = "Pacific Time (US & Canada)"

Как разобрать выше DateTime, чтобы находиться в правильном часовом поясе? Я знаю, что метод DateTime.new имеет 7-й аргумент для смещения по времени. Есть ли простой способ поиска смещения для часового пояса в данный момент времени? Или я должен использовать что-то другое, кроме DateTime?

Ответы

Ответ 1

Вы можете использовать Time.zone.local, если ранее установить Time.zone:

user_time = Time.zone.local(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i, 0)

Посмотрите на ActiveSupport::TimeWithZone документацию.

Ответ 2

Try:

Time.zone = "Pacific Time (US & Canada)"
Time.zone.parse('8-11-2013 23:59:59') #=> Fri, 08 Nov 2013 23:59:59 PST -08:00 

ИЛИ

Time.now.in_time_zone("Pacific Time (US & Canada)")

ИЛИ

DateTime.now.in_time_zone("Pacific Time (US & Canada)")

Ответ 3

Вы можете использовать следующий код для создания объекта DateTime с нужной вам TimeZone.

DateTime.new(2013, 6, 29, 10, 15, 30).change(:offset => "+0530")

ОБНОВЛЕНИЕ: В новой версии Rails Ruby 1.9.1 строка ниже выполняет ту же работу, что и магия.

DateTime.new(2013, 6, 29, 10, 15, 30, "+0530")

Документация здесь

Ответ 4

DateTime.new принимает необязательный аргумент смещения (как седьмой), начиная с ruby 1.9.

Мы можем написать

DateTime.new(2018, 1, 1, 0, 0, 0, Time.zone.formatted_offset)

Ответ 5

Если у вас уже есть правильный объект DateTime с именем "datetime", и вы хотите его скопировать, вы можете просто называть его "getutc" и после этого использовать "in_time_zone"

DateTime.new(datetime.getutc.year, datetime.getutc.month, datetime.getutc.day, time.getutc.hour, time.getutc.min).in_time_zone