2013-10-11 93 views
0

我有一個具有日期時間值的XML文件。我遍歷元素並獲取屬性值timeutc我想將UTC日期時間轉換爲ruby中的特定時區

我設法將它轉換爲本地時區,但我想要做的是將其轉換爲任何時區,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 
+0

什麼是日期的源格式? ISO或其他? – maerics

+0

請勿使用'$約會'。全球化對此不是必要的,而且地方性的「約會」更可以接受。 ''#{$ Appointments}「'也不需要,因爲它已經是一個字符串了。此外,你初始化和增加'索引',但沒有用它。 –

回答

1

你可以使用in_time_zone方法:

對於CST:

local_time.in_time_zone('Central Time (US & Canada)') 

對於PST:

local_time.in_time_zone('Pacific Time (US & Canada)') 

對於EST:

local_time.in_time_zone('Eastern Time (US & Canada)') 
+0

它給了我一個錯誤。我正在使用RubyMine。這可能適用於軌道上的紅寶石。 Test.rb:38:in'block in

':undefined method'in_time_zone'for 2013-10-09 23:00:00 -0700:Time(NoMethodError) from C:/Ruby193/lib/ruby/1.9 .1/rexml/element.rb:905:在C:/Ruby193/lib/ruby/1.9.1/rexml/xpath.rb中的每個' 中的塊中:67:在'each'中的C:/ Ruby193中的每個' /lib/ruby/1.9.1/rexml/xpath.rb:67:in從C:/Ruby193/lib/ruby/1.9.1/rexml/element.rb:905:在'each'中的每個' from Test.rb:17:'
' – Prasanna

+0

你使用rails還是隻是ruby? – usha

+0

是的。我只使用紅寶石而不是導軌。 – Prasanna

0

Ruby對時區的支持並不是那麼好(不確定這是否因2.0而改變),因此,各種ActiveSupport庫。

紅寶石看起來環境變量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是一個有效的ISO日期/時間(額外:00),但它看起來像Ruby沒有護理:

irb [1.9.3]$ DateTime.parse("2013-10-10T06:00:0000:000000").to_s 
=> "2013-10-10T06:00:00+00:00" 
相關問題