web-dev-qa-db-ja.com

ruby指定されたタイムゾーンの時間を取得

Rubyでは、特定のタイムゾーンの現在の時刻を取得するにはどうすればよいですか?私はUTCからのオフセットを知っており、そのオフセットでタイムゾーンの現在の時刻を取得したいと考えています。

32
ashweta

よりシンプルで軽量なソリューション:

Time.now.getlocal('-08:00')

よく文書化された ここ

2017.02.17を更新:タイムゾーンがあり、それをDSTを含む#getlocalで使用できるオフセットに変換したい場合は、次のようになりますそれを行う方法:

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#gmTime#local 、および Ruby TZInfoクラス 、特に TZInfo::Timezone.get および TZInfo::Timezone#period_for_local

37
Jim Meyer

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"
15
glenn jackman

他の人が言ったように、x時間のUTCオフセットの場合、現在の時刻はRailsのActiveSupportを使用して計算できます。

utc_offset = -7
zone = ActiveSupport::TimeZone[utc_offset].name
Time.zone = zone 
Time.zone.now

または2行の代わりに

DateTime.now.in_time_zone(zone)

または、Railsがない場合は、new_offsetを使用して、ロケートDateTimeを別のタイムゾーンに変換することもできます。

utc_offset = -7
local = DateTime.now
local.new_offset(Rational(utc_offset,24))
9
0x4a6f4672
gem install tzinfo

その後

require 'tzinfo'

tz = TZInfo::Timezone.get('US/Pacific')
Time.now.getlocal(tz.current_period.offset.utc_total_offset)
5
chadoh

これを行う簡単な方法は、オフセットを整数形式で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>>>>
3
NudeCanalTroll

gem install active_support、activesupport-3.00がインストールされ、エラーが発生しました:

「アプリケーションにtzinfoがインストールされていません。それをGemfileに追加して、バンドルインストールを実行してください。」

tzinfoはActiveSupportが使用する宝石です-私の目的には少しすっきりしており、外部に依存していません-欠点は、すべてがUTCのように見えるように見えるためです。タイムゾーンを正しく見せたい、gem install activerecordは必要なものすべてをインストールします。この回答は、主に同じ問題/ googlabilityに遭遇する他の人のための参照用に含めています。

(使用する gem install tzinfo)gemをインストールする

require 'tzinfo'
zone = TZInfo::Timezone.get('US/Eastern')
puts zone.now

タイムゾーンを取得する方法はいくつかありますが、リストを表示するには

TZInfo::Timezone.all
1
Kem Mason

あなたの環境で/development.rb

config.time_zone = 'Rangoon'

時間コードを取得したいソースコード

Time.zone.now.strftime('%Y-%m-%d %H:%M:%S')
0
zawhtut
now = Time.now
now.in_time_zone('Eastern Time (US & Canada)') 
or 
now.in_time_zone('Asia/Manila') 
0
jpw