Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VBA中获得自epoch(1/1/1970)以来的秒数?_Vba_Time_Epoch_Seconds - Fatal编程技术网

如何在VBA中获得自epoch(1/1/1970)以来的秒数?

如何在VBA中获得自epoch(1/1/1970)以来的秒数?,vba,time,epoch,seconds,Vba,Time,Epoch,Seconds,我怎样才能从年的epoch(1970年1月1日)开始获得秒数?这里有一个解决方案: 那么: datediff("s",#1970/1/1#,now()) 应比DateDiff解决方案运行更快: Private Function Long2Date(lngDate As Long) As Date Long2Date = lngDate / 86400# + #1/1/1970# End Function Private Function Date2Long(dtmDate As Da

我怎样才能从年的epoch(1970年1月1日)开始获得秒数?

这里有一个解决方案:

那么:

datediff("s",#1970/1/1#,now())
应比DateDiff解决方案运行更快:

Private Function Long2Date(lngDate As Long) As Date
    Long2Date = lngDate / 86400# + #1/1/1970#
End Function

Private Function Date2Long(dtmDate As Date) As Long
    Date2Long = (dtmDate - #1/1/1970#) * 86400
End Function

我试着修改我的时区和 考虑DST。时区更改时可以有不同的设置

Function Epoch2Date(lngDate As Long) As Date
'transfer to date
    Epoch2Date = lngDate / 86400# + #1/1/1970#
'check if it is summer time
    If IsDST(Epoch2Date) = False Then
'here you can use diferent values depend on time zone
    Epoch2Date = Epoch2Date - 0.041666667
    Else
    Epoch2Date = Epoch2Date - 0.0833333333333333
    End If
End Function

Public Function IsDST(ByVal d0 As Date) As Boolean
   IsDST = d0 >= NextSun("24.3." & Year(d0) & " 01:59:59") And d0 < NextSun("24.10." & Year(d0) & " 01:59:59")
End Function

Private Function NextSun(d1 As Date) As Date
        'if 24.3 or 24.10 is sunday returns 31.3 or 31.10
        If Weekday(d1, vbMonday) = 7 Then
            NextSun = d1 + 7
        Else
        'if not return nearest sunday
            NextSun = d1 + 7 - Weekday(d1, vbMonday)
        End If
    End Function
函数Epoch2Date(长度为lngDate)作为日期
“转移到日期
Epoch2Date=lngDate/86400#+#1/1/1970#
“看看是不是夏天
如果IsDST(Epoch2Date)=False,则
'在这里,您可以根据时区使用不同的值
Epoch2Date=Epoch2Date-0.041666667
其他的
Epoch2Date=Epoch2Date-0.0833333
如果结束
端函数
公共函数IsDST(ByVal d0作为日期)为布尔值
IsDST=d0>=NextSun(“24.3.”年(d0)和“01:59:59”)和d0
DateDiff(“s”,“01/01/1970 00:00:00”,Now())
&
格式(Now(),“ms”)
这里有一个在UTC返回的解决方案,因为DateDiff one根据您的时区返回一个值:

Private Function UnixEpoch() As Long

    Set ScriptEngine = CreateObject("MSScriptControl.ScriptControl")
    ScriptEngine.Language = "JScript"
    
    ScriptEngine.AddCode "function unixTime() { var d = new Date(); var s = Math.round(d.getTime() / 1000); return s; } "
    
    UnixEpoch = ScriptEngine.Run("unixTime")

End Function

在JScript上运行它可以解决VBA中必须解决的时区问题。

是的,我把它改成了这个
datediff(“s”),1970/1/1,dateadd(“h”,5,now())
。。。但不确定DST运行时我会做什么。因此没有办法自动处理到UTC的转换?UnixTimeStamp=DateDiff(“s”,“01/01/1970 00:00:00”,Now())&Format(Now(),“ms”)将为您提供UnixTimeStamp as 1537362312758
Private Function UnixEpoch() As Long

    Set ScriptEngine = CreateObject("MSScriptControl.ScriptControl")
    ScriptEngine.Language = "JScript"
    
    ScriptEngine.AddCode "function unixTime() { var d = new Date(); var s = Math.round(d.getTime() / 1000); return s; } "
    
    UnixEpoch = ScriptEngine.Run("unixTime")

End Function