В рубине, как я могу получить текущее время в данном часовом поясе? Я знаю смещение от UTC и хочу получить текущее время в часовом поясе с этим смещением.
Ruby get Время в заданном часовом поясе
Ответ 1
Более простое, более легкое решение:
Time.now.getlocal('-08:00')
Хорошо задокументировано здесь.
Обновление 2017.02.17: Если у вас есть часовой пояс и вы хотите превратить его в смещение, которое вы можете использовать С#getlocal, включая DST, вот один из способов сделать это:
require 'tzinfo'
timezone_name = 'US/Pacific'
timezone = TZInfo::Timezone.get(timezone_name)
offset_in_hours = timezone.current_period.utc_total_offset_rational.numerator
offset = '%+.2d:00' % offset_in_hours
Time.now.getlocal(offset)
Если вы хотите сделать это в моменты, отличные от #now
, вам следует изучить класс Ruby Time, в частности Time#gm
и Time#local
, а также классы Ruby TZInfo, в частности TZInfo::Timezone.get
TZInfo::Timezone#period_for_local
и TZInfo::Timezone#period_for_local
Ответ 2
Я бы использовал ActiveSupport gem:
require 'active_support/time'
my_offset = 3600 * -8 # US Pacific
# find the zone with that offset
zone_name = ActiveSupport::TimeZone::MAPPING.keys.find do |name|
ActiveSupport::TimeZone[name].utc_offset == my_offset
end
zone = ActiveSupport::TimeZone[zone_name]
time_locally = Time.now
time_in_zone = zone.at(time_locally)
p time_locally.rfc822 # => "Fri, 28 May 2010 09:51:10 -0400"
p time_in_zone.rfc822 # => "Fri, 28 May 2010 06:51:10 -0700"
Ответ 3
Для смещения UTC в х часов текущее время можно рассчитать с помощью ActiveSupport в Rails, так как остальные сказали:
utc_offset = -7
zone = ActiveSupport::TimeZone[utc_offset].name
Time.zone = zone
Time.zone.now
или вместо двух строк
DateTime.now.in_time_zone(zone)
Или, если у вас нет Rails, можно также использовать new_offset
для преобразования даты DateTime в другой часовой пояс
utc_offset = -7
local = DateTime.now
local.new_offset(Rational(utc_offset,24))
Ответ 4
gem install tzinfo
Тогда
require 'tzinfo'
tz = TZInfo::Timezone.get('US/Pacific')
Time.now.getlocal(tz.current_period.offset.utc_total_offset)
Ответ 5
Более простой способ сделать это - просто передать смещение (в целочисленной форме) в хеш ActiveSupport:: TimeZone:
ActiveSupport::TimeZone[-8]
=> #<ActiveSupport::TimeZone:0x7f6a955acf10 @name="Pacific Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/Los_Angeles>, @utc_offset=nil, @current_period=#<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionInfo: #<TZInfo::TimeOrDateTime: 1320570000>,#<TZInfo::TimezoneOffsetInfo: -28800,0,PST>>,#<TZInfo::TimezoneTransitionInfo: #<TZInfo::TimeOrDateTime: 1331460000>,#<TZInfo::TimezoneOffsetInfo: -28800,3600,PDT>>>>
Ответ 6
Я попробовал gem install active_support
, он установил activesupport-3.00, что дало мне ошибку:
"У вас нет tzinfo, установленного в вашем приложении. Добавьте его в свой Gemfile и запустите установку пакета"
tzinfo
- это драгоценный камень, который использует ActiveSupport - он был немного чище для моих целей, не имеет каких-либо внешних зависимостей. Недостатком является то, что он оставляет все, что похоже на UTC, поэтому, если вы хотите, чтобы ваши часовые пояса выглядели правильно, gem install activerecord
установит все, что вам нужно. Я включаю этот ответ в основном для справки для других, которые сталкиваются с той же проблемой /googlability.
(используйте gem install tzinfo
) для установки драгоценного камня
require 'tzinfo'
zone = TZInfo::Timezone.get('US/Eastern')
puts zone.now
существует несколько разных способов получить временные интервалы, но вы можете увидеть список, используя
TZInfo::Timezone.all
Ответ 7
now = Time.now
now.in_time_zone('Eastern Time (US & Canada)')
or
now.in_time_zone('Asia/Manila')
Ответ 8
Просто добавьте или вычтите соответствующее количество секунд:
>> utc = Time.utc(2009,5,28,10,1) # given a utc time => Thu May 28 10:01:00 UTC 2009 >> bst_offset_in_mins = 60 # and an offset to another timezone => 60 >> bst = t + (bst_offset_in_mins * 60) # just add the offset in seconds => Thu May 28 11:01:00 UTC 2009 # to get the time in the new timezone