Является ли Time.zone.now.to_date
эквивалентным Date.today
?
Другой способ: Time.zone.now.to_date == Date.today
всегда true
?
Если нет, то какой лучший способ получить объект Date, соответствующий "сейчас" в часовом поясе приложения?
Является ли Time.zone.now.to_date
эквивалентным Date.today
?
Другой способ: Time.zone.now.to_date == Date.today
всегда true
?
Если нет, то какой лучший способ получить объект Date, соответствующий "сейчас" в часовом поясе приложения?
Они не всегда одинаковы. Time.zone.now.to_date будет использовать часовой пояс приложений, а Date.today будет использовать часовой пояс серверов. Поэтому, если они лежат на разных датах, тогда они будут разными. Пример из моей консоли:
ruby-1.9.2-p290 :036 > Time.zone = "Sydney"
=> "Sydney"
ruby-1.9.2-p290 :037 > Time.zone.now.to_date
=> Wed, 21 Sep 2011
ruby-1.9.2-p290 :038 > Date.today
=> Tue, 20 Sep 2011
Еще проще: Time.zone.today
Я также написал небольшой вспомогательный метод Date.today_in_zone
, который позволяет очень легко получить "сегодня" Date
для определенного часового пояса без изменения Time.zone
:
# Defaults to using Time.zone
> Date.today_in_zone
=> Fri, 26 Oct 2012
# Or specify a zone to use
> Date.today_in_zone('Sydney')
=> Sat, 27 Oct 2012
Чтобы использовать его, просто выбросьте его в файл, например 'lib/date_extensions.rb'
и require 'date_extensions'
.
class Date
def self.today_in_zone(zone = ::Time.zone)
::Time.find_zone!(zone).today
end
end
Я думаю, что лучший способ - узнать текущее время через:
Time.current
Это автоматически проверяет, есть ли у вас часовой пояс, тогда он вызовет Time.zone.now, но если вы его не вызовете просто Time.now.
Кроме того, не забудьте установить часовой пояс в application.rb
# system timezone
Time.now.to_date == Date.today
# application timezone
Time.zone.now.to_date == Time.current.to_date == Time.zone.today == Date.current
http://edgeapi.rubyonrails.org/classes/Time.html#method-c-current http://edgeapi.rubyonrails.org/classes/Date.html#method-c-current