從資料庫匯出的時間欄位資料,有很大機會是 Unix 時間戳記 (unix time, unix timestamp) 格式。如何在 Excel 或 Google 試算表將 Unix 時間戳記轉成日期時間、或將日期時間轉成 Unix 時間戳記?
世界協調時間 (UTC)
網路教學文件 在 Excel 裡轉換 Unixtime 格式 提到的轉換公式
問題狀況
依據維基百科解釋 UNIX時間 是「從UTC1970年1月1日0時0分0秒起至現在的總秒數」。如果想要從 Excel 直接將 Unix 時間戳記轉換成日期時間,欄位值反而會變成「######」。在 Excel 要轉換數值成日期時間,需要是 datavalue 序列值。根據微軟 DATEVALUE 函數 - Office 支援 文件說明「Excel 會以連續的序列值儲存日期,以便將日期用於計算。 根據預設,1900 年 1 月 1 日是序列值 1」。轉換公式1: Unix 時間戳記 轉成日期時間
原本網路教學文件 在 Excel 裡轉換 Unixtime 格式 提到的轉換公式,是將 Unix 時間戳記轉成 datevalue 序列值,需要手動將儲存格格式從通用格式改成詳細時間格式。如果要從 Unix 時間戳記直接轉成日期時間,轉換公式:
世界協調時間 (UTC)
= TEXT( (Unixtime / 86400) + 25569, "YYYY-mm-dd hh:mm:ss")
世界協調時間 (UTC)
轉換公式2: 日期時間轉成 Unix 時間戳記
世界協調時間 (UTC)
= (VALUE(日期時間)-25569)*86400
轉換公式說明
網路教學文件 在 Excel 裡轉換 Unixtime 格式 提到的轉換公式
= Unixtime / 86400 + 25569 + 8/24教學文件作者提到「86400 是一天的秒數,25569 是從 1900年1月1日 至 1970年1月1日 的天數,記得嗎?Excel是從1900年1月1日起算的!」進一步探討 25569 的天數是如何計算的?
法1: 快解
=VALUE("1970/1/1") 或 =DATEVALUE("1970/1/1")微軟文件說明 VALUE 函數 「將代表某數值的文字字串轉換成數字。」。而 DATEVALUE 函數 則會「將儲存為文字的日期轉換成 Excel 辨識為日期的序列值。」。
法2: 慢解
如果改用 DATEDIF 函數 計算 1900年1月1日 至 1970年1月1日 的天數
=DATEDIF("1900/1/1", "1970/1/1", "D")
Excel 計算結果是 25568 (線上預覽)。1900年1月1日的序列值1,所以其他日期要計算序列值要改成序列值0起算。也就是 25568 + 1 = 25569。
但是相同函數在 Google 試算表或 LibreOffice Calc 的計算結果卻是 25567 (線上預覽)。實際逐年比較各年的天數,發現 1900 該年天數有差異。Excel 是 366 天,而 Google 試算表是 365 天。在微軟 判斷年份是否為閏年的方法 文件提到:
「因為 Excel 97 之前的 Microsoft Excel 版本僅能處理 1900 年至 2078 年,所以在 Microsoft Excel 中,只有 1900 年符合閏年的 100/400 排除規則。但是,為了與其他的程式相容,Microsoft Excel 將 1900 年視為閏年。」
你可以自行嘗試如果直接改從序列值 0 的日期,計算會發生什麼事?
👉 如果想要直接動手試試看,請前往線上編輯連結
參考資料
- 在 Excel 裡轉換 Unixtime 格式
- Unix Time Stamp - Epoch Converter 線上轉換日期時間與 Unix 時間戳記,可以驗證 Excel 是否計算錯誤
- 如何在Excel中的日期和Unix時間戳之間進行轉換? 轉換時需要強迫轉成日期格式,如果處理的問題需要到秒的精準度,則不建議使用該方式
- 如何檢查一年是否是Excel中的閏年?
- List of Time Zones of the World - TimeZoneDB 不同國家的時區對照表
- 不同國家代碼 (country code) 時區的 datevalue 序列值的偏移值對照表 將欄位「serial number offset of Excel datevalue」欄位值,取代上方公式的 8/24
- Excel 如何轉換文字格式的日期時間格式 (使用 VALUE, TEXT 函數)
留言
張貼留言