0

日時値を持つ XML ファイルがあります。要素をループして属性値を取得しますtimeutc

私はそれをローカルタイムゾーンに変換することができましたが、私がやろうとしているのは、それを任意のタイムゾーン、PST、CST、EST に変換することです。

$Appointments = '<appointments><appointment timeutc="2013-10-10T06:00:00" /><appointment timeutc="2013-10-10T06:00:00" /><appointment timeutc="2013-10-10T15:00:00" /></appointments>'
index = 0

doc = REXML::Document.new("#{$Appointments}")

doc.elements.each("appointments/appointment") do |element|
  index += 1
  value = element.attribute("timeutc").value

  to_datetime = DateTime.parse(value).to_s
  to_UTC = Time.iso8601(to_datetime).to_s

  local_time = Time.iso8601(to_datetime).localtime

  puts local_time # => 2013-10-09 23:00:00 -0700 

  puts   local_time.strftime("%A") # => Wednesday
  puts   local_time.strftime("%B") # => October
  puts   local_time.strftime("%-d") # => 9
  puts   local_time.strftime("%l") # => 11
  puts   local_time.strftime("%M") # => 00
  puts   local_time.strftime("%p") # => PM

end
4

2 に答える 2

0

Ruby のタイム ゾーンのサポートはそれほど優れていません (これが 2.0 で変更されたかどうかは不明です)。そのため、さまざまな ActiveSupport ライブラリが用意されています。

Ruby は環境変数TZを参照して、操作するゾーンを決定します。

irb [1.9.3]$ ENV["TZ"]  # Ruby will look elsewhere and see that I'm in NYC
=> nil
irb [1.9.3]$ Time.iso8601 "2013-10-10T06:00:00"
=> 2013-10-10 06:00:00 -0400
irb [1.9.3]$ ENV["TZ"]="America/Los_Angeles"
=> "America/Los_Angeles"
irb [1.9.3]$ Time.now.zone
=> "PDT"
irb [1.9.3]$ Time.iso8601 "2013-10-10T06:00:00"
=> 2013-10-10 06:00:00 -0700

そのため...アクティブなサポート方法を使用することを強くお勧めしますが、次のような方法を使用できます。

irb [1.9.3]$ def parse_in_zone(date, zone)
1{             old = ENV["TZ"]
1{             ENV["TZ"] = zone
1{             Time.iso8601 date
1{           ensure
1*             ENV["TZ"] = old
1{           end
=> nil
irb [1.9.3]$ parse_in_zone "2013-10-10T06:00:00", "America/Los_Angeles"
=> 2013-10-10 06:00:00 -0700
irb [1.9.3]$ parse_in_zone "2013-10-10T06:00:00", "America/New_York"
=> 2013-10-10 06:00:00 -0400

また、DateTime.parse(value)必要ありませんのでご注意ください。日付を解析するときに文字列のゾーンを考慮します。

irb [1.9.3]$ DateTime.parse("2013-10-10T06:00:00").zone
=> "+00:00"
irb [1.9.3]$ DateTime.parse("2013-10-10T06:00+04:00").zone
=> "+04:00"
irb [1.9.3]$ DateTime.parse("2013-10-10T06:00+07:00").zone
=> "+07:00"

2013-10-10T06:00:00あなたの場合、 string:は有効な iso 日付/時刻 (extra ) ではないと思いますが:00、ルビーは気にしないようです:

irb [1.9.3]$ DateTime.parse("2013-10-10T06:00:0000:000000").to_s
=> "2013-10-10T06:00:00+00:00"
于 2013-10-12T00:15:23.220 に答える