Rails 3: Как получить сегодня дату в определенный часовой пояс?

Чтобы получить сегодняшнюю дату, я:

Date.today    # => Fri, 20 May 2011

Я хочу получить сегодня дату в определенном часовом поясе, скажем 'Melbourne'.

У меня есть следующая настройка в моем application.rb:

config.time_zone = 'Melbourne'

и я установил:

Time.zone = 'Melbourne'

в моем контроллере приложений перед каждым действием.

Однако это не помогает (думаю, потому что эти настройки влияют только на даты, которые хранятся в базе данных).

Как я могу получить сегодняшнюю дату в 'Melbourne'?

Ответ 1

Вы должны иметь возможность сделать это: Time.current. Это покажет текущее время в Мельбурне, если установлено значение Time.zone.

Ответ 2

Date объекты не обязательно имеют временные интервалы, но объекты Time выполняются. Вы можете попробовать его как Time, а затем преобразовать обратно в Date:

Time.now.to_date
# => Thu, 19 May 2011 
Time.now.in_time_zone('Melbourne').to_date
# => Fri, 20 May 2011 

Ответ 4

Кажется, что работает Time.zone.today.

Ответ 5

Если вы хотите получить "сегодня" в определенном часовом поясе без изменения Time.zone, я бы сделал что-то вроде fl00r, а Dylan Markow предложил:

Time.now.in_time_zone('Melbourne').to_date

или это:

Time.find_zone!('Melbourne').today

Я написал небольшой вспомогательный метод Date.today_in_zone, который упрощает получение "сегодняшнего" Date для часового пояса:

 # Defaults to using Time.zone
 > Date.today_in_zone
=> Fri, 26 Oct 2012

 # Or specify a zone to use
 > Date.today_in_zone('Melbourne')
=> Sat, 27 Oct 2012

Я думаю, что он читается немного лучше, чем Time.find_zone!('Melbourne').today...

Чтобы использовать его, просто бросьте это в файл, например 'lib/date_extensions.rb' и require 'date_extensions'.

class Date
  def self.today_in_zone(zone = ::Time.zone)
    ::Time.find_zone!(zone).today
  end
end

Ответ 6

использовать DateTime класс

DateTime.now.in_time_zone 'Melbourne'

Ответ 7

ruby-1.9.2-p0 :004 > Time.now
 => 2011-05-19 15:46:45 +0100 
ruby-1.9.2-p0 :006 > Time.now.in_time_zone('Melbourne')
 => Fri, 20 May 2011 00:47:00 EST +10:00 
ruby-1.9.2-p0 :007 > Time.now.in_time_zone('Melbourne').to_date
 => Fri, 20 May 2011

Ответ 9

В Rails 3 вы можете просто сделать это, вызвав to_time_in_current_zone объекта Date.

Date.today.to_time_in_current_zone