Rails: перетворити UTC DateTime в інший часовий пояс


Відповіді:


206
time.in_time_zone(time_zone)

Приклад:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)

або просто

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

Ви можете знайти назви часових поясів ActiveSupport, виконавши:

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)

У irb, коли я пробую Time.now.in_time_zone ('CST'), я отримую помилку "невизначений метод 'in_time_zone'". Чи потрібні мені заняття рейками, щоб змусити це працювати?
Дрю Джонсон

Яку версію Rails ви використовуєте? Чи працює це, якщо ви робите Time.zone.now.in_time_zone (...)?
mckeed

13
require 'active_support/time'Спершу користуйтеся цим за межами Rails .
сунаку

3
Ви можете перелічити всі часові пояси, запустивши rake time:zones:all. Також див rake -D time. Встановіть часовий пояс за замовчуванням у config/application.rb.
user664833

1
@AdamEberlin У Rails зазвичай використовується ActiveSupport :: TimeWithZone, а не DateTime. Весь цей код працює як на рубінових об'єктах DateTime, так і на об'єктах Time.
mckeed

6

якщо Time.zoneце бажаний часовий пояс, ви можете використовувати@date.to_time.to_datetime

> @date
=> Tue, 02 Sep 2014 23:59:59 +0000
> @date.class
=> DateTime
> @date.to_time
=> 2014-09-02 12:59:59 -1100
> @date.to_time.to_datetime
=> Tue, 02 Sep 2014 12:59:59 -1100 

Не працює на Rails 5 `Time.zone # => Європа / Париж my_date # => Ср, 29 березня 2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => Ср, 29 березня 2017 17:00:20 +0000`
Кирило Дюшон-Доріс

5

У звичайному рубіні require 'date', використовуючи лише new_offsetметод:

require 'date'

d=DateTime.parse('2000-01-01 12:00 +0200')
l=d.new_offset('-0700')
u=l.new_offset('UTC')
puts "#{u.strftime('%a %F %T %Z')} ❖ #{l.strftime('%a %F %T %Z')}"

Тестований на рубіні 2.3.7, який став стандартним для Mac OS X 10.13.


3

Спробуйте об’єкти TimeWithZone ActiveSupport, що маніпулюються з TimeZone. ActiveSupport також забезпечує метод in_time_zone для перетворення часу UTC у визначений часовий пояс TimeZone. Відповідь mckeed показує код.


Який синтаксис для імпорту TimeWithZone до мого класу? Або я отримую це за замовчуванням з Rails?
Дрю Джонсон

1
Я вважаю, ви отримуєте це за замовчуванням. mckeed має потрібний вам код, але його ви не побачите в irb. Потрібно запустити його в Rails.
Фред

Ви маєте рацію - спасибі, Фреде - це за замовчуванням йде з Rails. Я хапався за соломинку, намагаючись змусити її працювати в irb.
Дрю Джонсон

3

Про всяк випадок, якщо ви маєте справу з об’єктом ActiveRecord в Rails.

Можливо, буде корисно використовувати Time.use_zoneчасовий пояс за замовчуванням, який переосмислює встановлений часовий пояс за замовчуваннямconfig.time_zone

Детальніше я пояснюю на https://stackoverflow.com/a/25055692/542995


0

Я використовую simple_form в Rails 4, і я просто додав поле введення як

<%= f.input :time_zone, :as => :time_zone %>

з міграцією

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end

1
Це не відповідає на питання про те, як перетворити об’єкти DateTime
zykadelic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.