簡答回答
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而這樣做。
你如何寫作excel文件?您應該確實將日期存儲爲雙精度OLE自動化日期和Excel本機存儲。這樣你就不會有區域/時區問題。 – InContext
@PhilipABarnes將數據轉換爲整數。它似乎是通過excel正確解析到GMT時間。 – bdares