1

Тема: VBScript: текущее время в формате с миллисекундами (hh:mm:ss.fff)

Option Explicit

WScript.Echo "Current time: " & strGetCurrTime(Timer)

WScript.Quit 0
'=============================================================================

'=============================================================================
Function strGetCurrTime(dtTimer)
    Dim intHours
    Dim intMinutes
    Dim intSeconds
    Dim intMilliSeconds
    
    intHours        = dtTimer \ (60 * 60)
    intMinutes      = (dtTimer - (intHours * (60 * 60))) \ 60
    intSeconds      = Fix(dtTimer - (intHours * (60 * 60)) - intMinutes * 60)
    intMilliSeconds = Fix((dtTimer - Fix(dtTimer)) * 1000)
    
    strGetCurrTime = CStr(TimeSerial(intHours, intMinutes, intSeconds)) & "." & Right("000" & CStr(intMilliSeconds), 3)
End Function
'=============================================================================

Результат работы примера:

Current time: 01:03:48.158

При этом предполагаются следующие региональные настройки времени:

REGEDIT4

[HKEY_CURRENT_USER\Control Panel\International]
"sTime"=":"
"sTimeFormat"="HH:mm:ss"
"iTimePrefix"="0"

Замечание: функция VBScript «Timer», как и любой другой метод измерения времени, имеет определённую точность (или, что в данном случае более правильно, разрешающую способность) измерения. Оценить её среднюю величину для конкретной программно-аппаратной конфигурации можно с помощью следующего скрипта:

Option Explicit


Dim arrTimerValues(1024)
Dim StartTimerValue

Dim i
Dim Summ


StartTimerValue   = Timer
arrTimerValues(0) = Timer - StartTimerValue

Summ = 0

For i = LBound(arrTimerValues) + 1 To UBound(arrTimerValues)
    Do
        arrTimerValues(i) = Timer - StartTimerValue
    Loop Until arrTimerValues(i) <> arrTimerValues(i - 1)
    
    Summ = Summ + (arrTimerValues(i) - arrTimerValues(i - 1))
Next

'WScript.Echo "Time, sec     " & vbTab & "Diff, sec     "
'WScript.Echo "==============" & vbTab & "=============="
'
'For i = LBound(arrTimerValues) + 1 To UBound(arrTimerValues)
'    WScript.Echo FormatNumber(arrTimerValues(i), 9) & vbTab & FormatNumber(arrTimerValues(i) - arrTimerValues(i - 1), 9)
'Next

WScript.Echo "==============" & vbTab & "=============="
WScript.Echo "Average, sec  " & vbTab & FormatNumber(Summ / 1024, 9)
WScript.Echo "==============" & vbTab & "=============="

WScript.Quit 0

Отдельное спасибо коллеге kefi за замечание.

Дополнение: измерить характеристики таймера также можно с помощью утилиты ClockRes.

2

Re: VBScript: текущее время в формате с миллисекундами (hh:mm:ss.fff)

Ещё один способ получения текущего времени с миллисекундами:

Set timeNow = CreateObject("WScript.Shell").exec("CMD /C ECHO %TIME%").StdOut
msgbox timeNow.readline

Автор идеи — kiber_punk.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3 (изменено: Poltergeyst, 2009-03-07 18:51:26)

Re: VBScript: текущее время в формате с миллисекундами (hh:mm:ss.fff)

Получение системной даты и времени с учетом настроек часового пояса с использованием библиотеки DynamicWrapperX:

'-----------------------------------------------------------------------------
'Получение системной даты и времени с учетом настроек часового пояса.
'Потребуется зарегистрированная библиотека DynamicWrapperX
'OC WinME/XP
'-----------------------------------------------------------------------------
'-----------------------------------------------------------------------------
Set DX=CreateObject("DynamicWrapperX")
'-----------------------------------------------------------------------------
With DX
    .Register "KERNEL32.DLL","GetLocalTime","i=l","r=l"
    SYSTEMTIME=.StrPtr(String(16,Chr(32)))

    fRes=.GetLocalTime(SYSTEMTIME)

wYear        =.NumGet(SYSTEMTIME,0,"t")    'Год
wMonth        =.NumGet(SYSTEMTIME,2,"t")    'Месяц
wDayOfWeek    =.NumGet(SYSTEMTIME,4,"t")    'День недели
wDay        =.NumGet(SYSTEMTIME,6,"t")    'Число
wHour        =.NumGet(SYSTEMTIME,8,"t")    'Час
wMinute        =.NumGet(SYSTEMTIME,10,"t")    'Минута
wSecond    =.NumGet(SYSTEMTIME,12,"t")    'Секунда
wMilliseconds    =.NumGet(SYSTEMTIME,14,"t")    'Миллисекунда
End With
'-----------------------------------------------------------------------------

If Len(wMinute)=1 Then wMinute="0" & wMinute
If Len(wSecond)=1 Then wSecond="0" & wSecond

MsgBox _
        "~~~~~~~~~~~~~~~~~~~~~~~~~~~~"    & vbCR & _
        vbTAB     & "Дата:"                 & vbCR & _
        vbTAB    & wDay                    & vbCR & _
        vbTAB     & MonthName(wMonth)             & vbCR & _
        vbTAB     & WeekDayName(wDayOfWeek,False,2)    & vbCR & _
        vbTAB     & wYear                 & vbCR & _
        "~~~~~~~~~~~~~~~~~~~~~~~~~~~~"     & vbCR & _
        vbTAB     & "Время:"                 & vbCR & _
        vbTAB     & wHour    & "." & _
            wMinute & "." & _
            wSecond & ":" & _
            wMilliseconds                & vbCR & _
        "~~~~~~~~~~~~~~~~~~~~~~~~~~~~"     & vbCR, _
        vbSystemModal+vbExclamation, _
        "Текущие дата и время"
'-----------------------------------------------------------------------------
    Set DX=Nothing
    WScript.Quit()

4

Re: VBScript: текущее время в формате с миллисекундами (hh:mm:ss.fff)

Способ замера времени в коде с помощью объекта JSSys3.dll:

Set oSys = CreateObject("JSSys3.Ops")
oSys.TimerStart()
WScript.Sleep 600
WScript.Echo oSys.TimerStop() ' количество прошедших миллисекунд
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.