获取Unix时间毫秒

Dmi*_*kin 9 excel datetime vba excel-vba

在Java中获取系统时间(以毫秒为单位)我使用:

 new date().gettime()
Run Code Online (Sandbox Code Playgroud)

使用Excel VBA可以在几毫秒内获得相同的结果?

bou*_*err 5

总结:为获得最佳效果,请使用GetSystemTime.

Excel 工作表函数的Now()精度相对较好,大致可以低至 10 毫秒。但是要调用它,您必须使用工作表公式。

要正确获取毫秒值,您应该避免使用 VBANow()函数。它的精度大约是 1 秒。

VBATimer()函数single以大约 5 毫秒的精度返回 a 。但是您必须使用Now()来获取日期部分。如果这可能会导致一个小问题,Now()被称为午夜Timer()被称为午夜(这可能是一个罕见的情况,而不是大多数人的问题)。

Windows API 函数GetSystemTime具有真正的毫秒精度。您可以使用SYSTEMTIME结构中的值来创建具有正确毫秒精度的 Excel 双精度值。GetSystemTime 返回 UTC 时间,因此如果您想要 POSIX 格式的日期,您可以减去 UNIX 纪元(UTC 1970 年 1 月 1 日),即 Excel 日期格式的 25569(不考虑闰秒)。

下面的代码比较了每种方法的精度:

Option Explicit

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)

Function Now_System() As Double
    Dim st As SYSTEMTIME
    GetSystemTime st
    Now_System = DateSerial(st.wYear, st.wMonth, st.wDay) + _
        TimeSerial(st.wHour, st.wMinute, st.wSecond) + _
        st.wMilliseconds / 86400000#
End Function

Function Now_Timer() As Double
    Now_Timer = CDbl(Int(Now)) + CDbl(Timer() / 86400#)
End Function


Sub CompareCurrentTimeFunctions()
    ' Compare precision of different methods to get current time.
    Me.Range("A1:D1000").NumberFormat = "yyyy/mm/dd h:mm:ss.000"

    Dim d As Double
    Dim i As Long
    For i = 2 To 1000
        ' 1) Excel NOW() formula returns same value until delay of ~10 milliseconds. (local time)
        Me.Cells(1, 1).Formula = "=Now()"
        d = Me.Cells(1, 1)
        Me.Cells(i, 1) = d

        ' 2) VBA Now() returns same value until delay of ~1 second. (local time)
        d = Now
        Me.Cells(i, 2) = d

        ' 3) VBA Timer returns same value until delay of ~5 milliseconds. (local time)
        Me.Cells(i, 3) = Now_Timer

        ' 4) System time is precise down to 1 millisecond. (UTC)
        Me.Cells(i, 4) = Now_System
    Next i
End Sub
Run Code Online (Sandbox Code Playgroud)