2014-07-07 40 views
1

我有以下的日期字符串(「美國/東部」),我需要轉換爲UTC:紅寶石local_to_utc返回無效的年份

date_src = '2014-07-07T23:10:00+0' 

首先,我將其轉換爲一個「有效」的格式,所以我可以在後續流程中運行。我使用以下有一個日期的iso版本:

date = DateTime.parse(date_src).iso8601 

在這一點上是一個不錯的'2014-07-07T23:10:00+00:00'。我的過程的最後一步是將此日期轉換爲UTC。我使用了以下內容:

TZInfo::Timezone.get('US/Eastern').local_to_utc(date) 

的問題是,這是給我作爲輸出,而不是原來的日期UTC版本。如果我嘗試:

TZInfo::Timezone.get('UTC').local_to_utc(date)

我得到,這是正確的一年,但仍然不可預測的輸出。

關於我在做什麼錯的任何想法,以及我可以用來解決問題的方法?

+0

'+ 0'(或'+00:00')會指示UTC已經存在......那麼在'US/Eastern'? –

回答

3

local_to_utc實際上需要一個TimeDateTime實例:

TZInfo::Timezone.get('US/Eastern').local_to_utc(DateTime.parse(date_src)) 
# => #<DateTime: 2014-07-08T03:10:00+00:00 ((2456847j,11400s,0n),+0s,2299161j)> 

從文檔,你可以對實際發生的情況的提示:上一次操作

TZInfo所有方法可以與TimeDateTime實例一起使用,或與nteger時間戳(即由Time#to_i返回)。該類型的返回值將匹配傳入的類型。

實際發生的是輸入參數,它在一個字符串從字符串開始處返回的分析整數local_to_utc電話to_i(2014因爲date你的情況是字符串2014-07-07T23:10:00+00:00),並增加了時間差,以它 - 18000爲「美國/東方」(5小時的時差),並0UTC

date.to_i 
# => 2014 

TZInfo::Timezone.get('US/Eastern').local_to_utc(date) - date.to_i 
# => 18000 

TZInfo::Timezone.get('UTC').local_to_utc(date) - date.to_i 
# => 0 

因此,底線是 - 種偶然地,你看到了這個wei rd行爲,這源於彙編了你使用的API的一些令人驚訝的怪癖......

+0

工作就像一個魅力!感謝您花時間寫出如此詳盡的解釋。 「這一切都有道理」:) Saludos desde哥斯達黎加。 – Edwin