Dmi*_*kin 9 excel datetime vba excel-vba
在Java中获取系统时间(以毫秒为单位)我使用:
new date().gettime()
Run Code Online (Sandbox Code Playgroud)
使用Excel VBA可以在几毫秒内获得相同的结果?
总结:为获得最佳效果,请使用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)
| 归档时间: |
|
| 查看次数: |
2641 次 |
| 最近记录: |