2012-11-28 39 views
2

我有寫到Excel文件的Time對象。我正在使用axlsx庫。將日期轉換爲單元格數據的類是DateTimeConverter,它將其轉換爲浮點時間戳。導出到Excel - 如何處理時間戳?

按預期顯示的時間爲mm/DD/YYYY HH:MM:SS,但值爲GMT時間。

有沒有辦法讓Excel格式化特定時區或讀者的本地時區的時間?我目前的解決方案是將格式化的時間作爲字符串導出,我對此不滿意。

有沒有辦法做到這一點,而無需添加VBA宏? (請注意,我並沒有試圖將本地時間轉換爲格林威治標準時間格式,而是根據鏈接的「重複」問題,而是將GMT時間顯示爲本地時間 - 如果可能,最好不使用VBA宏。)

+0

你如何寫作excel文件?您應該確實將日期存儲爲雙精度OLE自動化日期和Excel本機存儲。這樣你就不會有區域/時區問題。 – InContext

+0

@PhilipABarnes將數據轉換爲整數。它似乎是通過excel正確解析到GMT時間。 – bdares

回答

5

簡答回答

Excel時間戳不知道任何關於時區的信息。如果您想導出一個值並在當地時間顯示它,則需要將utc_offset添加到發送給Axlsx的時間。

t = ... 
excel_time = Time.at(t.to_f + t.utc_offset) 
sheet.add_row ["Time:", excel_time] 

龍答案

在Ruby(和許多其他的編程語言)時間戳表示爲自1970年1月1日00:00:00 UTC(時代)的秒數。 Ruby Time對象還保留一個時區,以便在打印出來時顯示當地時間。如果更改時區,則時間將以不同的方式打印出來,但底層號碼保持不變。

在Excel中,時間戳表示爲自1900年1月1日以來的天數(或1904年,具體取決於工作簿設置);時間表示爲一天中的一小部分。如果今天的日期是41262,那麼上午12點是41262.0,中午是41262.5。這個方案中沒有時區,時間就是你讀過手錶的數字。

當Axlsx將一個Ruby Time對象導出到Excel中時,它會調用to_f以獲取自該紀元以來的秒數,然後執行一些數學運算將其轉換爲Excel所喜歡的序列號。大!但它扔掉了utc_offset,這就是爲什麼時間在UTC中出現在Excel中。

解決的辦法是簡單地將UTC偏移量添加到代碼中的時間,然後再將它們交給Axlsx。例如,如果你在東部標準時間,你必須減去五個小時。從技術上講,就Ruby而言,您創建的新時間對象是不正確的,但我們只是爲了取悅Excel而這樣做。

+0

所以你說Excel沒有時區的概念。多麼令人失望。 – bdares

+0

如果你使用的是Rails,你可以像這樣使用'to_s(:db)':'User.last.created_at.to_s(:db)' –

+2

FYI - 下一個版本的axlsx(2.0.0)將自動調整seraialized的值包括時區偏移量。我們中的許多人都對此感到沮喪,並且認爲如果axlsx爲您添加(或減去)任何偏移量會更好。 – randym