Преобразование UTC в местное время в Rails 3



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



сказать moment некоторые Time переменная в формате UTC (например moment = Time.now.utc). Как мне конвертировать moment в своем часовом поясе, уход за перехода на летнее время (т. е. через доллар США)?



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



надеюсь, есть еще путь?



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

516   6  

6 ответов:

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

rake time:zones:us

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

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

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

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

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

Update: если вы хотите перейти к конкретным часовым поясам, а не к своему собственному часовому поясу, вы на правильном пути. Однако вместо того, чтобы беспокоиться о EST vs 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 

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

https://github.com/basecamp/local_time

легко настроить с помощью локальной зоны системы , Просто в вашем приложении.РБ добавить этот

config.time_zone = Time.now.zone

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

Post.created_at.localtime

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

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

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

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

такой:

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

config.time_zone = "Singapore"

Итак, это все, что вам нужно сделать, и вы хорошо идти.

Comments

    Ничего не найдено.