Конвертировать UTC в местное время в Рельсах 3 - PullRequest
90 голосов
/ 14 марта 2011

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

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

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

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

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

Ответы [ 6 ]

109 голосов
/ 14 марта 2011

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 
105 голосов
/ 14 марта 2011

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

rake time:zones:us

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

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

Time.now.in_time_zone("Eastern Time (US & Canada)")
15 голосов
/ 19 марта 2014

На самом деле есть хороший Gem под названием local_time от basecamp, который делает все это только на стороне клиента, я считаю:

https://github.com/basecamp/local_time

10 голосов
/ 28 октября 2016

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

config.time_zone = Time.now.zone

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

Post.created_at.localtime
0 голосов
/ 07 августа 2018

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

Как это:

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

config.time_zone = "Singapore"

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

0 голосов
/ 22 мая 2016

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

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

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

...