Подтвердить что ты не робот

Ruby get Время в заданном часовом поясе

В рубине, как я могу получить текущее время в данном часовом поясе? Я знаю смещение от UTC и хочу получить текущее время в часовом поясе с этим смещением.

4b9b3361

Ответ 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