Rubyでは、特定のタイムゾーンの現在の時刻を取得するにはどうすればよいですか?私はUTCからのオフセットを知っており、そのオフセットでタイムゾーンの現在の時刻を取得したいと考えています。
よりシンプルで軽量なソリューション:
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#gm
と Time#local
、および Ruby TZInfoクラス 、特に TZInfo::Timezone.get
および TZInfo::Timezone#period_for_local
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"
他の人が言ったように、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))
gem install tzinfo
その後
require 'tzinfo'
tz = TZInfo::Timezone.get('US/Pacific')
Time.now.getlocal(tz.current_period.offset.utc_total_offset)
これを行う簡単な方法は、オフセットを整数形式で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>>>>
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
あなたの環境で/development.rb
config.time_zone = 'Rangoon'
時間コードを取得したいソースコード
Time.zone.now.strftime('%Y-%m-%d %H:%M:%S')
now = Time.now
now.in_time_zone('Eastern Time (US & Canada)')
or
now.in_time_zone('Asia/Manila')