2014-05-23 5 views
2

Я использую datetimepicker и вам нужно сохранить строку datetime, полученную из params, в datetime в конкретном часовом поясе, зависящем от пользователя. Это позволит мне сохранить дату и время UTC для базы данных.Преобразование строки в datetime в определенный часовой пояс

params[:notify_at] #=> "2014-07-05 14:30:00" 

user.time_zone #=> #<ActiveSupport::TimeZone:0x00000007535ac8 @name="Warsaw", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Europe/Warsaw>, @current_period=nil> 

И я хотел бы сделать что-то вроде:

date = params[:notify_at].to_datetime(user.time_zone) #=> Sat, 05 Jul 2014 12:30:00 +0000 
(its 14:30 in user's localtime but 12:30 in UTC) 

ответ

3

Вы можете использовать метод in_time_zone. Например:

DateTime.current.in_time_zone("Alaska") 
# => Fri, 23 May 2014 07:21:30 AKDT -08:00 

Так для случая использования:

params[:notify_at].to_datetime.in_time_zone(user.time_zone) 

Pro Tip: При использовании Rails v4 + вы действительно можете сделать это прямо на строку:

"2014-07-05 14:30:00".in_time_zone("Alaska") 
# => Sat, 05 Jul 2014 14:30:00 AKDT -08:00 

UPDATE

Вы можете разобрать строку непосредственно в часовом поясе (wh прежде чем строка должна быть уже в этом часовом поясе), как это:

Time.zone.parse("2014-07-05 14:30:00") 
# => Sat, 05 Jul 2014 14:30:00 CEST +02:00 

Так что для вашего случая использования сделать:

user.time_zone.parse(params[:notify_at]) 
+0

Уже пробовал это так, но это не то, что я чтобы сделать. to_datetime преобразует строку в UTC как это (так будет 14:30 в UTC в любом случае). После вызова in_time_zone («Варшава») он дает мне «Сб, 05 июл 2014 16:30:00 CEST +02: 00», что не так - мне нужно »Сб, 05 июл 2014 14:30:00 CEST +02: 00 '. – Jacka

+0

Ах, я вижу. Обновлен мой ответ. Посмотрите, работает ли это. – pdobb

+0

Да, это все, просто подумал о себе, но спасибо за правильный ответ :) – Jacka

0

Попробуйте это: -

date = params[:notify_at].to_datetime.in_time_zone(user.time_zone) 

Rails консольного вывода: -

1.9.3p385 :004 > d= "2014-07-05 14:30:00" 
=> "2014-07-05 14:30:00" 
1.9.3p385 :010 > d.to_datetime.in_time_zone("Pacific Time (US & Canada)") 
=> Sat, 05 Jul 2014 07:30:00 PDT -07:00 
1.9.3p385 :011 > d.to_datetime.in_time_zone("Alaska") 
=> Sat, 05 Jul 2014 06:30:00 AKDT -08:00 
1.9.3p385 :012 > to_datetime.in_time_zone 

 Смежные вопросы

  • Нет связанных вопросов^_^