Excel vba:将 Unix 时间戳转换为日期时间

Mic*_*iew 2 excel vba

我知道这个问题已经被问了很多,但由于某种原因,似乎没有一个解决方案适合我。

我有一个 unix 时间戳(例如使用 1637402076084)

在我的 Excel 工作表上,我可以使用 = (C2/ 86400000) + DATE(1970,1,1) 转换该罚款 在此输入图像描述

不过,我想在我的 VBA 代码中执行此操作,因为有大量数据,并且我更喜欢在数组中执行所有操作,然后将数组应用到工作表(出于性能目的)

但是在我的代码中我尝试使用 dateAdd

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

但我收到溢出错误

在此输入图像描述

我假设这是因为 unix 时间戳太大?但它是从 api 调用返回的,并且是一个真正的(如公式所示),但我不确定为什么我的代码不起作用。

Fan*_*uru 5

UNIX 时间戳有两种类型。10位和13位。您尝试使用的功能适用于 10 位数字类型。要转换 13 位数字类型,您应该创建另一个函数,与单元格中使用的完全相同:

Function fromUNIX13Digits(uT) As Date
   fromUNIX13Digits = CDbl(uT) / 86400000 + DateSerial(1970, 1, 1)
End Function
Run Code Online (Sandbox Code Playgroud)

并将其测试为:

Sub testFromUNIX13()
      Debug.Print fromUNIX13Digits("1637402076084")
End Sub
Run Code Online (Sandbox Code Playgroud)

对于 10 位数字类型,您可以使用:

Public Function fromUnix10(ts) As Date
    fromUnix10 = DateAdd("s", CDbl(ts), "1/1/1970")
End Function
Run Code Online (Sandbox Code Playgroud)

并使用以下方法测试它:

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

或者构建一个能够处理这两种类型的函数:

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
Run Code Online (Sandbox Code Playgroud)

并使用以下方法测试它:

Sub testFromUnix_()
 Dim x As String, y As String
 x = "1637402076084"
 y = "1651680385"
 Debug.Print FromUNIX(x)
 Debug.Print FromUNIX(y)
End Sub
Run Code Online (Sandbox Code Playgroud)