Преобразование 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) годовой.
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 -0700Update: если вы хотите перейти к конкретным часовым поясам, а не к своему собственному часовому поясу, вы на правильном пути. Однако вместо того, чтобы беспокоиться о 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, чтобы сделать все это только на стороне клиента, я считаю:
легко настроить с помощью локальной зоны системы , Просто в вашем приложении.РБ добавить этот
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