it-swarm.com.ru

Конвертировать UTC в местное время в Rails 3

У меня проблемы с преобразованием UTC Time или TimeWithZone в местное время в Rails 3.

Скажем, moment - это некоторая переменная Time в UTC (например, moment = Time.now.utc). Как мне преобразовать moment в свой часовой пояс, заботясь о DST (то есть используя EST/EDT)?

Точнее, я хотел бы распечатать "Понедельник 14 марта, 9 утра", если время соответствует сегодняшнему утру 9 утра по восточному поясному времени и "Понедельник 7 марта, 9 утра", если время было 9 утра по восточному времени в последний понедельник.

Надеюсь, есть другой способ?

Редактировать : я впервые подумал что "EDT" должен быть признанным часовым поясом, но "EDT" не является действительным часовым поясом, больше похоже на состояние часового пояса. Например, не имеет смысла просить Time.utc(2011,1,1).in_time_zone("EDT"). Это немного сбивает с толку, так как "EST" является фактическим часовым поясом, используемым в нескольких местах, которые не используют летнее время и являются (UTC- 5) год.

90
Marc-André Lafortune

У Rails есть свои имена. Смотрите их с:

rake time:zones:us

Вы также можете запустить rake time:zones:all для всех часовых поясов . Чтобы увидеть больше связанных с зонами граблей: rake -D time

Итак, для преобразования в EST, питание для DST автоматически:

Time.now.in_time_zone("Eastern Time (US & Canada)")
104
Zabba

Time#localtime даст вам время в текущем часовом поясе машины, на которой выполняется код:

> moment = Time.now.utc
  => 2011-03-14 15:15:58 UTC 
> moment.localtime
  => 2011-03-14 08:15:58 -0700 

Обновление: если вы хотите конвертировать в определенные часовые пояса, а не в свой собственный, вы на правильном пути. Однако, вместо того, чтобы беспокоиться о EST против EDT, просто перейдите в общий восточный часовой пояс - он будет знать в зависимости от дня, является ли это EDT или EST:

> Time.now.utc.in_time_zone("Eastern Time (US & Canada)")
  => Mon, 14 Mar 2011 11:21:05 EDT -04:00 
> (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)")
  => Sat, 14 Jan 2012 10:21:18 EST -05:00 
107
Dylan Markow

На самом деле, существует base Gem, называемый local_time by basecamp, который делает все это только на стороне клиента, я считаю:

https://github.com/basecamp/local_time

15
mahatmanich

Его легко настроить, используя системную локальную зону, Просто в вашем application.rb добавьте это

config.time_zone = Time.now.zone

Затем Rails должен показать вам метки времени в вашем местном времени, или вы можете использовать что-то вроде этой инструкции, чтобы получить местное время

Post.created_at.localtime
10
jacr1614

Не знаю почему, но в моем случае это не работает так, как было предложено ранее .. Но работает так:

Time.now.change(offset: "-3000")

Конечно, вам нужно изменить значение offset на ваше.

0
Seybo Glaux

Если вы на самом деле делаете это только потому, что хотите получить часовой пояс пользователя, тогда все, что вам нужно сделать, это изменить свой часовой пояс в себе config/applications.rb.

Как это:

Rails по умолчанию сохранит вашу запись времени в UTC, даже если вы укажете текущий часовой пояс.

config.time_zone = "Singapore"

Так что это все, что вам нужно сделать, и вы готовы идти.

0
therealadrain