ruby получить время в заданном часовом поясе - PullRequest
31 голосов
/ 28 мая 2010

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

Ответы [ 9 ]

37 голосов
/ 04 января 2015

Более простое и легкое решение:

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

15 голосов
/ 28 мая 2010

Я бы использовал ActiveSupport драгоценный камень:

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"
9 голосов
/ 20 апреля 2012

Для смещения UTC, равного x часам, текущее время можно рассчитать с помощью 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))
5 голосов
/ 09 марта 2017
gem install tzinfo

Тогда

require 'tzinfo'

tz = TZInfo::Timezone.get('US/Pacific')
Time.now.getlocal(tz.current_period.offset.utc_total_offset)
3 голосов
/ 18 февраля 2012

Более простой способ сделать это - просто передать смещение (в целочисленной форме) хешу 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>>>>
1 голос
/ 19 июля 2012

Я попробовал 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
0 голосов
/ 24 апреля 2019

В вашей среде / development.rb

config.time_zone = 'Rangoon'

В исходном коде вы хотите получить данные времени

Time.zone.now.strftime('%Y-%m-%d %H:%M:%S')
0 голосов
/ 18 декабря 2018
now = Time.now
now.in_time_zone('Eastern Time (US & Canada)') 
or 
now.in_time_zone('Asia/Manila') 
0 голосов
/ 28 мая 2010

Просто добавьте или вычтите соответствующее количество секунд:

>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...