Как создать 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