Тема: VBS : Как Получить время в формате hh:mm:ss:msec ?
VBS : Как Получить время в формате hh:mm:ss:msec ?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → Windows Script Host, HTA (VBScript, JScript) → VBS : Как Получить время в формате hh:mm:ss:msec ?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
VBS : Как Получить время в формате hh:mm:ss:msec ?
kefi, ты освоил копи-пастинг из заголовка темы в пост? Поздравляю, это достижение . Поделись технологией, как копировал? Мышкой тащил в браузере?
Откуда нужно получить время в формате hh:mm:ss:msec?
OFF: Слив защитан
Как узнать милисекунды не знаю:
MsgBox( Hour(Now)&":"&Minute(Now)&":"&Second(Now) )
-red-
Я не понял, а кто и от чего сливается-то?
Set dtmDate = CreateObject("WbemScripting.SWbemDateTime")
'dtmDate.SetVarDate(Now)
dtmDate.Value = "20090219235959.022000+180"
Wscript.Echo dtmDate.GetVarDate()
Wscript.Echo dtmDate.Microseconds
Wscript.Echo dtmDate.UTC
Ну все, загнали под плинтус ... :weep:
kefi, ты освоил копи-пастинг из заголовка темы в пост? Поздравляю, это достижение
. Поделись технологией, как копировал? Мышкой тащил в браузере?
Откуда нужно получить время в формате hh:mm:ss:msec?
Нет - тащил не мышкой? - а в чем , собсвенно, фишка такого вопроса?
Откуда - написано в теме - из VBS.
А вообще спасибо за щедрость, правда, вот в win2K pro нет такого объекта. Нужно бы , чтобы под Win2K pro тоже работало.
Poltergeyst > Я Вас , конечно, насмешу, но нужны миллисекунды не для обратного, а для прямого отсчета полета на Марс, а также для логгирования работы программы.
Кстати , у меня чей-то и под XP микросекунды не выдает
Set dtmDate = CreateObject("WbemScripting.SWbemDateTime") 'dtmDate.SetVarDate(Now) dtmDate.Value ="20090219160931.000000+180" ' супртив Вашего "20090219235959.022000+180" Wscript.Echo dtmDate.GetVarDate() ' 19.02.2009 16:09:31 Wscript.Echo dtmDate.Microseconds ' 0 Wscript.Echo dtmDate.UTC ' 180
Откуда - написано в теме - из VBS.
Ты ещё скажи "из компьютера".
Кстати , у меня чей-то и под XP микросекунды не выдает
Выдаёт, просто они у тебя нулевые.
Пока других идей по работе с милли(микро)секундами у меня нет, а твой вопрос по-прежнему не ясен. Тебе нужны миллисекунды текущего времени, для записи в лог? Зачем такой ужасный лог?
Как вариант. Код LangMF 7.7.
'------------------------------------------------------------------------------
'SYSTEMTIME
'[
' wYear: word;
' wMonth: word;
' wDayOfWeek: word;
' wDay: word;
' wDay: word;
' wMinute: word;
' wSecond: word;
' wMilliseconds: word;
']
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[Область модуля]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<#Module=SystemTime>
'------------------------------------------------------------------------------
Sub Load(command)
Dim Buf(16)
Sys.DynAPI.CurBuf=0
Sys.DynAPI.ReBuf(16)
SYSTEMTIME=Sys.DynAPI.PtrBuf(0)
'----------------------------------------------------------------------
hRes =Sys.DynApi.CallFunction( _
"KERNEL32.DLL", _
"GetLocalTime", _
SYSTEMTIME)
'----------------------------------------------------------------------
Sys.DynAPI.GetBuf(Buf)
'----------------------------------------------------------------------
wYear =Sys.Conv.Byte4Long(0,0,buf(1), buf(0))
wMonth =Sys.Conv.Byte4Long(0,0,buf(3), buf(2))
wDayOfWeek =Sys.Conv.Byte4Long(0,0,buf(5), buf(4))
wDay =Sys.Conv.Byte4Long(0,0,buf(7), buf(6))
wHour =Sys.Conv.Byte4Long(0,0,buf(9), buf(8))
wMinute =Sys.Conv.Byte4Long(0,0,buf(11), buf(10))
wSecond =Sys.Conv.Byte4Long(0,0,buf(13), buf(12))
wMilliseconds =Sys.Conv.Byte4Long(0,0,buf(15), buf(14))
'----------------------------------------------------------------------
MsgBox "Год " & wYear & vbCR & _
"Месяц " & wMonth & vbCR & _
"День недели " & wDayOfWeek & vbCR & _
"День месяца " & wDay & vbCR & _
"Час " & wHour & vbCR & _
"Минута " & wMinute & vbCR & _
"Секунда " & wSecond & vbCR & _
"Миллисекунда " & wMilliseconds, _
vbSystemModal
'----------------------------------------------------------------------
EndMF
End Sub
<#Module>
а в чем , собсвенно, фишка такого вопроса?
В том, что вопросы надо задавать как следует, и нет смысла копировать заголовок в пост.
Poltergeyst
Это можно и в Коллекцию . Можно даже вариант на DynamicWrapperX + VBScript состряпать, если не лень.
Ты ещё скажи "из компьютера".
Не понял - что ты тогда хотел , когда спрашивал "откуда" ?
PS/
Два раза сказал, что из VBS, нет, Poltergeyst всеоавно для LangMF публикует пример. Что ж вам надо-то? Как яснее-то объяснить столь обширную тему ?
kefi
Не пытайся казаться глупее, чем ты есть. Получить "время из VBS" — это полнейший идиотизм. Получить текущее время в VBS — это уже нормально. Кстати, ты до сих пор прямо не подтвердил, что тебе нужно именно текущее время. Так что, может быть, мы до сих пор все разговариваем тут неизвестно о чём. Наводящие вопросы ты, кстати, тоже игнорируешь. Зачем тебе лог в миллисекундах?
Не пытайся казаться глупее, чем ты есть. Получить "время из VBS" — это полнейший идиотизм.
Я не пытаюсь, я действительно глупее, чем я есть, м.б., следует признать твое мое название "идиот", если можете, смените мне логин на это имя .
Тем, что осталось в бестолковке,я наконец-то тепепатировал, что ты хотел сказать про "получить откуда", отказывается, пропущенное мной "текущее время" было всему виной.
Лог в миллисекундах, насколько я могу собразить, нужен, для того, чтобы знать сколько времени отработал тот или иной кусочек, программы, хотя, вообще говоря, это уже является офтопом, т.к. по теме - не важно , для чего это нужно. Другими словами, которые я еще могу наскрести на дне своего бессознания, это означает, что для чего бы не требовалось получить текущее время в миллисекундах, его нужно получить в миллисекундах, причем желательно , чтобы работало и на Win200 pro и без подключения WinAPI функций.
to Poltergeyst:
лучше пиши так, и проще и понятней получается.
Да и кстати в твоем примере буфер надо указывать не buf(16) а buf(15) , т.к. буфер начинаеться с 0.
Declare Sub GetLocalTime Lib "kernel32" Alias "GetLocalTime" (lpSystemTime As SYSTEMTIME)
<#Module=SystemTime>
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
'------------------------------------------------------------------------------
Sub Load(command)
Dim sysTime as SYSTEMTIME
GetLocalTime(sysTime)
with sysTime
MsgBox "Год " & .wYear & vbCR & _
"Месяц " & .wMonth & vbCR & _
"День недели " & .wDayOfWeek & vbCR & _
"День месяца " & .wDay & vbCR & _
"Час " & .wHour & vbCR & _
"Минута " & .wMinute & vbCR & _
"Секунда " & .wSecond & vbCR & _
"Миллисек. " & .wMilliseconds, vbSystemModal
end with
EndMF
End Sub
<#Module>
Лог в миллисекундах, насколько я могу собразить, нужен, для того, чтобы знать сколько времени отработал тот или иной кусочек, программы, хотя, вообще говоря, это уже является офтопом, т.к. по теме - не важно , для чего это нужно.
Сильно ошибаешься насчёт "не важно".
WScript.Echo Timer()
WScript.Sleep 2000
WScript.Echo Timer()
kefi
И ещё: редактор SciTE показывает время исполнения скрипта, примерно в такой форме:
>cscript /nologo "C:\Temp\Testing\test.vbs"
72660,89
72662,89
>Exit code: 0 Time: 2.300
(Это вывод от исполнения скрипта постом выше.)
kefi
А вот правильный ответ на твой вопрос, заданный изначально:
WScript.Echo "23:59:59:59"
Теперь попробуй докажи мне, что я ответил на него неверно.
А "время в VBS" можно получать откуда угодно в какой угодно форме, например, в виде строки неизвестно какого формата, хранящейся в базе данных неизвестно какого формата. И вопрос мог сводиться к разбору и обработке этой строки, например. Вопрос мог сводиться к обработке времени, возвращаемого инструментами WMI и т.д., т.е что угодно вообще.
А вот правильный ответ на твой вопрос, заданный изначально:
"Так бы сразу и сказаал ... "("Джентельмены удачи")
А я бы тебе тогда уточнил , что нужно , и тогда не пришлось бы тебе несколько раз намекать и говорить открытым текстом, что я идиот, из-за моей невнимательности при первом посте, который мне казался настолько простым, что я решился на преступление (правда , не знаю чего преступление) и просто скопировал заголовок в тему. А вообще, никогда нельзя полностью ничего определить правильно, всегда люди предполагают некоторое понимание недоговорености условий по умолчанию, пока ты не смог привести ни одного сколь - нибудь рузумного предположения относительно того. чтобы я мог подразумевать под своим вопросом :
А "время в VBS" можно получать откуда угодно в какой угодно форме, например, в виде строки неизвестно какого формата, хранящейся в базе данных неизвестно какого формата. И вопрос мог сводиться к разбору и обработке этой строки, например
Это все предположения не имеющие никакого разумного объяснения в контексте темы, т.е. если бы человеку это было надо , он бы об этом упомянул.
Но , разумеется, если человек не идиот, а если предположить изначально обратное, тогда конечно , должны были бы возникнуть такие вопросы.
Короче разборок море, смысла - лужа для LanMF, которая является офтопом. За WMI я уже поблагодарил, за идиота тоже, хотелось бы все же , чтобы скрипт работал не только на XP машинах , но и на Win2000 .
kefi написал:Кстати , у меня чей-то и под XP микросекунды не выдает
Выдаёт, просто они у тебя нулевые.
А почему они у меня нулевые, а у тебя не нулевые ? Я несколько раз делал попытки , а все сижу на нуле.
Option Explicit
Dim i
WScript.Echo "Текущее время:", strGetCurrTime(Timer)
Randomize Timer
For i = 1 To 50
WScript.Echo strGetCurrTime(Timer)
WScript.Sleep Int(200 * Rnd + 1)
Next
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
'=============================================================================
Добавлю, почему именно «20:38:40.234», а не «20:38:40:234»: во всех встречавшихся мне форматах (в том числе и в MSDN) миллисекунды отделяются от секунд именно точкой [DateTime.Now.ToString("h:mm:ss.fff")].
лучше пиши так, и проще и понятней получается.
Спасибо, все работает
Это можно и в Коллекцию . Можно даже вариант на DynamicWrapperX + VBScript состряпать, если не лень.
Хорошо, подумаю об этом
2 alexii > Вот то, что было бы нужно . Но...
Но! Почему же пишется в Help'е ,что Timer возвращает число секунд, когда он еще и число сотых секунды выдает , т.е. можно ли доверять этим миллисекундам ?
Впрочем, погрешность , конечно, хотелось бы поменьше .....
В принципе, можно попробовать и проще, если не будет большого разрыва в коде между получением «Timer» и «Time()»:
Option Explicit
Dim dtTimer
dtTimer = Timer
WScript.Echo Time() & "." & Right("000" & CStr(Fix((dtTimer - Fix(dtTimer)) * 1000)), 3)
WScript.Quit 0
Но всё равно уже будет риск получить неверный результат.
kefi
"Так бы сразу и сказаал" — это про тебя, и только про тебя.
Это все предположения не имеющие никакого разумного объяснения в контексте темы...
Да не было у темы никакого "контекста", а был только бодрый копи-пастинг заголовка в пост, с расчётом на телепатию всех присутствующих.
Про микросекунды в WMI забудь, т.к. теперь, исходя из "контекста", который наконец-то появился, они точно не нужны. Кстати, на сам вопрос тебе уже хорошо и неоднократно ответили, насколько я понимаю. А вот правильная формулировка твоего изначального вопроса:
Как для оценки производительности участка кода VBScript получить время с точностью до миллисекунд?
Всего лишь навсего, бляха муха.
2kefi: сравните с этим и посмотрите, где начинаются значения, которым уже нет смысла доверять. Я не знаю, как и на какой микросхеме сейчас реализуется тайминг, потому ничего конкретного про точность сказать не могу. Ранее это было (1/18.2) секунды.
Option Explicit
Dim i
Randomize Timer
For i = 1 To 50
WScript.Echo strGetCurrTime(Timer)
WScript.Sleep Int(200 * Rnd + 1)
Next
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)) * 1000000)
strGetCurrTime = CStr(TimeSerial(intHours, intMinutes, intSeconds)) & "." & Right("000000" & CStr(intMilliSeconds), 6)
End Function
'=============================================================================
alexii
Твои примеры тоже в Коллекцию неплохо бы поместить .
to Poltergeyst:
Еще исходник подправил, вообще ляпота стала
2The gray Cardinal, хорошо, но только первый. Насчёт второго у меня сильные сомнения — думаю, коль при использовании второго примера получить ошибку принципиально вполне возможно, то и не стоит его лепить в Коллекцию.
уже будет риск получить неверный результат
Да, конечно, это ни к чему. Есть же вышеприведенная Вами функция , она прячет все усложнения, которые Вы теперь вносите в код. Вопрос только в точности измерений , хотелось бы msec ... Впрочем , уже видимо, ничего не придумать, WMI вызовы , как и вызовы других объектов или WinAPI Windows из-под VBS будут вносить свои погрешности в определение времени, Т.е. , наверно, для VBS на сотых нужно остановиться .
А насчет Win32 & WMI - не спешите выбрасывать их в помойку. Они одинаково хорошо определяют миллисекунды, как и другие методы. Но между точным моментом определения миллисекунд и выводом сообщения или записью лога с количеством этих миллисекунд может существовать задержка, зависящая от выбранного метода. И это вовсе не погрешность
Выложил в Коллекцию первый пример: VBScript: текущее время в формате с миллисекундами (hh:mm:ss.fff).
OFF: Ой, сколько понаписали =о
Решение в две строки, с точностью до 100-х долей:
Set timeNow = CreateObject("WScript.Shell").exec("CMD /C ECHO %TIME%").StdOut
msgbox timeNow.readline
1. Вы представляете как быстро будет исполняться в такой реализации код из #21 ?!
2. Переменная окружения %time%, мягко говоря, не совсем точно поддерживает заданные региональные стандарты.
Тоже задумался.. на запуск консоли будет уходить время. Но можно запустить её при старте самого VBS-скрипта и взаимодействовать с ней интерактивно во время исполнения.
региональные стандарты
Не совсем понял... Разве переменная %time% не "интернациональна"? Милисекунды они и в Африке милисекунды
p.s. это просто пример реализации по теме
А может все же кто-нибудь объяснить, отчего все же у меня не получается получить не нулевые milliсекунды в этом коде :
Set dtmDate = CreateObject("WbemScripting.SWbemDateTime")
dtmDate.SetVarDate(Now)
dtmDate.Value ="20090219160931.[b]000000[/b]+180" ' супротив того, что у кардинала - "20090219235959.022000+180"
?
А что ты хочешь получить в качестве объяснений?
Wscript.Echo CStr(1) ' вот здесь нормально всё
Wscript.Echo CStr(0) ' не, ну объясните мне, а чё это оно здесь вдруг ноль выводит?
А что ты хочешь получить в качестве объяснений?
А чтобы ты хотел получить , если бы у тебя возникла такая проблема ?
Какая проблема, ёперный театр? Что непонятного в том, что если миллисекунд нет в строковом представлении даты, то их и не оказывается при автоматическом разборе этой строки объектом "WbemScripting.SWbemDateTime"? В чём вопрос-то?
Люди, человеки! Хоть кто-нибудь здесь понимает, о чём спрашивает kefi?
если миллисекунд нет в строковом представлении даты, то их и не оказывается при автоматическом разборе этой строки объектом "WbemScripting.SWbemDateTime" В чём вопрос-то?
Так в этом самом и вопрос , пятый раз пытаюсь выпытать - ПОЧЕМУ они у тебя есть в Now, а у меня нет ? Что непонятно-то ?
ПОЧЕМУ они у тебя есть в Now, а у меня нет ? Что непонятно-то ?
См. #4. Непонятно то, что у меня их нет в Now. Где ты там увидел миллисекунды в Now? Там есть микросекунды в строковой константе, которая набрана вручную на клавиатуре, исключительно для того, чтобы показать, что объект успешно обрабатывает микросекунды, работая с этим форматом даты.
2 The gray Cardinal > Ну дык ... сразу бы так и сказал, а то чукча еще долго бы репу чесала .
kefi, я просто охреневаю с тебя.
— ПОЧЕМУ у тебя это есть?
— У меня этого нет.
— Сразу бы так и сказал.
Очень интеллектуальная дискуссия.
Давай учись вопросы задавать как следует, чтобы хотя бы не ставить в тупик всех беспредельной нелепостью вопроса. Ты когда спрашиваешь, ставь себя на место потенциальных отвечающих. Представляй себе, как у них волосы шевелятся на голове от твоих "вопросов". Пиши и представляй себе, как твой вопрос читают, что могут подумать, прочитав, и т.д.
Давай учись вопросы задавать как следует
Аднака, чукча уже 12-й год учится в интернете , все никак научитться не может.
Но можно запустить её при старте самого VBS-скрипта и взаимодействовать с ней интерактивно во время исполнения.
Согласен, я как-то не подумал о такой возможности .
У меня, например, даже при приведённых в #1 региональных настройках времени ["sTimeFormat"="HH:mm:ss"], ведущий ноль заменяется пробелом при раскрытии переменной %time%:
C:\Temp> . echo %time% 4:55:03.25 C:\Temp> .
В то же время в VBScript возвращается правильная трактовка с ведущим нулём:
WScript.Echo Time()
WScript.Echo Now()
04:58:19 21.02.2009 04:58:19
С другой строны — я даже не занимался этим вопросом, чтобы понять «це баг о це фича» .
Выложил в Коллекцию первый пример: VBScript: текущее время в формате с миллисекундами (hh:mm:ss.fff).
Только вот заголовок там (да что там заголовок и содержание ) некорректен. Дело в Вашем посте выше о том, с какого системного счетчика берется время, Я так думаю, что и %time% и Timer берут время с одного 1/18.2 сек счетчика , следовательно люди глядя в ту тему могут быть обмануты (если конечно не будут внимательны) на +-25 msec ( примерно 1/18.2=0.050 сек - абсолютная погрешность метода)
Надо бы озаглавить, как в формате с сотыми, да и то обратить внимание , что погрешность будет +-2.5 единицы.
kefi, формат времени, который я приводил, взят с MSDN, используется в WMI и .Net FrameWork как минимум. Вы можете привести ссылки по этому рассуждению:
Дело в Вашем посте выше о том, с какого системного счетчика берется время, Я так думаю, что и %time% и Timer берут время с одного 1/18.2 сек счетчика , следовательно люди глядя в ту тему могут быть обмануты (если конечно не будут внимательны) на +-25 msec ( примерно 1/18.2=0.050 сек - абсолютная погрешность метода)
kefi, формат времени, который я приводил, взят с MSDN, используется в WMI и .Net FrameWork как минимум. Вы можете привести ссылки по этому рассуждению:
kefi пишет:Дело в Вашем посте выше о том, с какого системного счетчика берется время, Я так думаю, что и %time% и Timer берут время с одного 1/18.2 сек счетчика , следовательно люди глядя в ту тему могут быть обмануты (если конечно не будут внимательны) на +-25 msec ( примерно 1/18.2=0.050 сек - абсолютная погрешность метода)
Мда, видно поспешил я , Просто я руководствовался одним простым принципом - здравым смыслом (ну Вы знаете - это, когда знаний нет, а решение принять хочется ) , но малось лопухнулся. Не 18 Гц , а 64.
Ну т.е. я подумал, а отчего же это Timer %time% при распечатке представляется системой с точностью до сотых секунды (подумал , что это они 18.2 Герца натягивают, но несколько дело не так - 64 герца ) :
Вот решил поднять свои старые вопросы и обнаружил, что оказывается для большинства это 64 Hz, но все-равно не 1000Hz, как предполагает Ваш алгоритм (Т.е., попросту говоря, Timer , конечно , дает число секунд с точносьтю до микро, т.е. миллионных, но они стоя'т на месте в течении 1/64 секунды, видно формат расчитан на продвинутое в этом отношении железо, которого у обычного юзера нет, короче, в той теме описано ... ).
В общем-то в той теме все решено, кроме того , чтобы решить этот топик без привлечения API функций, ну т.е., как это и нужно было бы для чистого скриптинга.
Где-то здесь же видел такой:
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
Ещё один способ получить текущее время с миллисекундами:
VBScript: работа с датами с помощью компонента ISO8601 Component
2kefi: я обозрел достаточное количество информации на предмет измерения временных интервалов и самого времени на Wintel-платформе и сделал для себя некоторые выводы. В общем — что достаточно точных (и, главное, унифицированных) способов измерения временных отрезков на этой платформе в настоящее время не существует. В частности же, я решил добавить Ваше замечание в пост в Коллекции. Спасибо, коллега.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться