我知道这个问题已经被问了很多,但由于某种原因,似乎没有一个解决方案适合我。
我有一个 unix 时间戳(例如使用 1637402076084)
在我的 Excel 工作表上,我可以使用 = (C2/ 86400000) + DATE(1970,1,1) 转换该罚款

不过,我想在我的 VBA 代码中执行此操作,因为有大量数据,并且我更喜欢在数组中执行所有操作,然后将数组应用到工作表(出于性能目的)
但是在我的代码中我尝试使用 dateAdd
DateAdd("s", 1637402076084#, "1970/1/1 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
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)
| 归档时间: |
|
| 查看次数: |
2238 次 |
| 最近记录: |