2016-02-18 6 views
1

Я пытаюсь преобразовать дату и время с внешним полем часового пояса в UTC. Может кто-нибудь объяснить мне, почему это не работает?Rails - изменение часового пояса

time_str = '2016-03-01 00:00' 
zone_str = 'Pacific Time (US & Canada)' 

Time.use_zone(zone_str) { Time.parse(time_str).in_time_zone('UTC') } 

Что я ожидаю:

'2016-03-01 08:00' 

Что я получаю:

'2016-03-01 06:00' 

В основном, это игнорирует мой use_zone вызов и только с помощью моего локального часового пояса, который Центральный.

Что я должен делать вместо этого?

- редактировать -

Обратите внимание, что я не пытаюсь установить часовой пояс по всей заявке. Я ТОЛЬКО пытаюсь взять один набор входов (время и часовой пояс в отдельных полях формы) и преобразовать их в UTC.

+1

Я принял решение @ Ильи, но я нашел проблему с моим специальным кодом. 'Time.use_zone (zone_str) {Time.zone.parse (time_str) .in_time_zone ('UTC')}' Я делал 'Time.parse' вместо' Time.zone.parse'. –

ответ

3

Попробуйте это решение:

time = ActiveSupport::TimeZone.new(zone_str).parse(time_str) 
time.in_time_zone('UTC') 
#=> Tue, 01 Mar 2016 08:00:00 UTC +00:00 
+0

Да, это так! –

1
time_str = '2016-03-01 00:00' 
zone_str = 'Pacific Time (US & Canada)' 
time = ActiveSupport::TimeZone.new(zone_str).parse(time_str) 
time.in_time_zone('UTC') 

используйте этот выше код.

+0

Я не хочу назначать его по всему приложению - только для одного набора входов. –

+0

Итак, вы изменили свой неправильный ответ, скопировав правильный ответ дословно? –

0

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

time_str = '2016-03-01 00:00' 
zone_str = 'Pacific Time (US & Canada)' 
Time.zone = zone_str 
Time.zone.parse(time_str).in_time_zone("UTC") 
+0

Это работает, но есть опасность установить 'Time.zone' с намерением использовать его только для одного запроса. По-видимому, это может просочиться в следующий запрос в потоке. –

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