В Rails, как лучше всего создать определенное время (не сейчас) в определенном часовом поясе? - PullRequest
40 голосов
/ 17 мая 2011

Вот один из способов, но вы можете придумать более приятный или более «рейлсовый» метод?

>> Time.use_zone('Sydney'){ Time.zone.parse('2011-04-12 2pm') }
=> Tue, 12 Apr 2011 14:00:00 EST +10:00

Ответы [ 5 ]

32 голосов
/ 19 ноября 2012

Я думаю, что вы ищете

Time.find_zone('Alaska').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 AKST -09:00

Time.find_zone('Amsterdam').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 CET +01:00 

Time.find_zone('Sydney').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 EST +11:00  

Time.find_zone('Wellington').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 NZDT +13:00

Это также работает с разбора

Time.find_zone('Sydney').parse('2011-04-12 2pm')
=> Tue, 12 Apr 2011 14:00:00 EST +10:00 
29 голосов
/ 19 мая 2011

Для анализа даты в определенном часовом поясе вы можете использовать ActiveSupport :: TimeZone

> ActiveSupport::TimeZone["Sydney"].parse("2011-04-12 2pm")
=> Tue, 12 Apr 2011 14:00:00 EST 10:00

Документация по API TimeZone находится здесь: http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-c-5B-5D

18 голосов
/ 18 мая 2011

Вот что я использую:

Time.zone.local(2011, 4, 12, 14, 0)
6 голосов
/ 10 апреля 2014

Как сказано выше, чтобы создать время в определенном часовом поясе (например, 4/10/2014, 13:30, Нью-Йорк):

@event.start_time = Time.find_zone('Eastern Time (US & Canada)').local(2014,4,10,13,30)
=> Thu, 10 Apr 2014 13:30:00 EDT -04:00 

@event.start_time.utc
=> 2014-04-10 17:30:00 UTC

Когда оно будет сохранено в вашей БД, оно будетпреобразуется в UTC (по крайней мере, в Postgres, если в миграции используется тип метки времени), и при последующем доступе он будет отображаться относительно часового пояса приложения, установленного в config / application.rb

Для правильного отображения местного времениМы также сохраняем название часового пояса (например, «Восточное время (США и Канада)») в нашей базе данных.Итак, когда мы хотим напечатать время в наших представлениях, мы делаем ...

@event.start_time.in_time_zone(@event.timezone)
 => Thu, 10 Apr 2014 13:30:00 EDT -04:00 

Чтобы получить сокращенный часовой пояс (например, EST)

@event.start_time.in_time_zone(@event.timezone).zone
=> "EDT" 
0 голосов
/ 17 мая 2011

Как насчет использования * in_time_zone * помощника ..

Time.now.in_time_zone('Sydney')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...