簡體   English   中英

Excel vba:將 Unix 時間戳轉換為日期時間

[英]Excel vba : Convert Unix Timestamp to Date Time

我知道這已經被問了很多,但由於某種原因,沒有一個解決方案似乎對我有用。

我有一個 unix 時間戳(例如使用 1637402076084)

在我的 excel 表上,我可以使用 = (C2/86400000) + DATE(1970,1,1) 進行轉換在此處輸入圖像描述

但是我想在我的 VBA 代碼中執行此操作,因為有很多數據,我更喜歡在數組中完成所有操作,然后將我的數組應用於工作表(出於性能目的)

但是在我的代碼中,我嘗試使用 dateAdd

DateAdd("s", 1637402076084#, "1/1/1970 00:00:00")

但我得到一個溢出錯誤

在此處輸入圖像描述

我假設這是因為 unix 時間戳太大了? 但它是從 api 調用返回的,是一個真正的(如公式所示),但我不確定為什么我的代碼不起作用。

有兩種類型的 UNIX 時間戳。 10位和13位 您嘗試使用的功能是 10 位數字類型。 要轉換 13 位數字類型,您應該創建另一個函數,與在單元格中使用的完全相同:

Function fromUNIX13Digits(uT) As Date
   fromUNIX13Digits = CDbl(uT) / 86400000 + DateSerial(1970, 1, 1)
End Function

並將其測試為:

Sub testFromUNIX13()
      Debug.Print fromUNIX13Digits("1637402076084")
End Sub

對於 10 位數字類型,您可以使用:

Public Function fromUnix10(ts) As Date
    fromUnix10 = DateAdd("s", CDbl(ts), "1/1/1970")
End Function

並使用以下方法對其進行測試:

Sub testFromUnix10()
   Debug.Print fromUnix10("1651680385")
   Debug.Print Format(fromUnix10("1651680385"), "yyyy/mm/dd hh:nn:ss")
End Sub

或者構建一個能夠處理這兩種類型的函數:

Function FromUNIX(uT) As Date
   If Len(uT) = 10 Then
        FromUNIX = DateAdd("s", CDbl(uT), "1/1/1970")
   ElseIf Len(uT) = 13 Then
        FromUNIX = CDbl(uT) / 86400000 + DateSerial(1970, 1, 1)
   Else
        MsgBox "No UNIX timestamp passed to be converted..."
   End If
End Function

並使用以下方法對其進行測試:

Sub testFromUnix_()
 Dim x As String, y As String
 x = "1637402076084"
 y = "1651680385"
 Debug.Print FromUNIX(x)
 Debug.Print FromUNIX(y)
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM