Excel VBA:将日期字符串转换为Unix时间戳

ecr0jaav  于 2023-04-13  发布在  Unix
关注(0)|答案(3)|浏览(202)

Excel VBA:如何转换日期字符串
“2012-08-20”至时间戳:1345438800
我需要在单元格中存储1345438800作为长数据类型值。

bpzcxfmw

bpzcxfmw1#

日期到时间戳:

Public Function toUnix(dt) As Long
    toUnix = DateDiff("s", "1/1/1970", dt)
End Function

到日期的时间戳:

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

gwbalxhn2#

要确保准确的完整往返,请向DateDiff和DateAdd函数添加时间戳:
日期到时间戳:

Public Function toUnix(dt) As Long
    toUnix = DateDiff("s", "1/1/1970 00:00:00", dt)
End Function

到日期的时间戳:

Public Function fromUnix(ts) As Date
    fromUnix = DateAdd("s", ts, "1/1/1970 00:00:00")
End Function
eivnm1vs

eivnm1vs3#

由于Year 2038 problem,这个问题的当前答案在2038-01-18之后的日期不起作用。
为了避免在日期大于2038-01-18时发生溢出错误,您可以使用LongLong参数,该参数将为您提供一个64位长的参数。
日期的时间戳:

Public Function UnixFromDate(ByVal dt As Date) As LongLong
    UnixFromDate= DateDiff("s", "1/1/1970 00:00:00", dt)
End Function

时间戳中的日期:
(Note DateAdd需要一个double,所以我们不能使用它,必须自己实现它。

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

这假定您使用的是64位版本的Office。
如果您需要支持旧版本的Office,则仍可以使用Decimal数据类型
请注意,此时只能在变量中使用Decimal数据类型。不能将变量声明为Decimal类型。但是,可以使用CDec函数创建子类型为Decimal的变量。请参阅数据类型摘要。
以下是我在64位版本的Office上尝试的方法(灵感来自this answer

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

相关问题