我知道这个问题被问了很多次,但出于某种原因,似乎没有一个解决方案对我有效。
我有一个unix时间戳(例如,使用1637402076084)
在我的excel表上,我可以使用= (C2/ 86400000) + DATE(1970,1,1)来转换罚款。
但是,我想在我的VBA代码中这样做,因为这里有很多数据,我更喜欢在数组中这样做,然后将我的数组应用到工作表中(为了性能目的)。
然而,在我的代码中,我试图使用dateAdd
DateAdd("s",1637402076084#,"1/1/1970 00:00:00")
但是我得到了一个溢出错误
我想这是因为unix时间戳太大了吧?但是它是一个api调用返回的函数,也是一个geniune调用(如公式所示),但我不知道为什么我的代码不能工作。
发布于 2022-07-17 14:41:36
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
https://stackoverflow.com/questions/73011816
复制相似问题