Function DateFromUnix(ByVal unixTime As LongLong) As Date
Dim epochTime As Date
epochTime = #1/1/1970#
DateFromUnix = epochTime + (unixTime \ 86400) + ((unixTime Mod 86400) / 86400#)
End Function
Public Function UnixFromDate32bit(ByVal dt As Date) As Variant
UnixFromDate32bit = DateDiff("s", "1/1/1970 00:00:00", dt)
End Function
Function DateFromUnix32bit(ByVal unixTime As Variant) As Date
Dim epochTime As Date
epochTime = #1/1/1970#
Dim unixDecimal As Variant
unixDecimal = CDec(unixTime)
Dim days As Long
days = Fix(unixDecimal / 86400)
unixDecimal = CDec(unixDecimal - (days * CDec(86400)))
DateFromUnix32bit = epochTime + days + (unixDecimal / 86400)
End Function
3条答案
按热度按时间bpzcxfmw1#
日期到时间戳:
到日期的时间戳:
gwbalxhn2#
要确保准确的完整往返,请向DateDiff和DateAdd函数添加时间戳:
日期到时间戳:
到日期的时间戳:
eivnm1vs3#
由于Year 2038 problem,这个问题的当前答案在2038-01-18之后的日期不起作用。
为了避免在日期大于2038-01-18时发生溢出错误,您可以使用
LongLong
参数,该参数将为您提供一个64位长的参数。日期的时间戳:
时间戳中的日期:
(Note DateAdd需要一个double,所以我们不能使用它,必须自己实现它。
这假定您使用的是64位版本的Office。
如果您需要支持旧版本的Office,则仍可以使用Decimal数据类型
请注意,此时只能在变量中使用Decimal数据类型。不能将变量声明为Decimal类型。但是,可以使用CDec函数创建子类型为Decimal的变量。请参阅数据类型摘要。
以下是我在64位版本的Office上尝试的方法(灵感来自this answer: