2015-04-09 5 views

ответ

1

Вы не столкнетесь с разделом строки даты WMI, чтобы сделать ее строкой даты, которую понимает VBScript. Попробуйте это:

<% 

    wmiDate = "20141103113859.220250+060" 

    ' note i am using date format: [m/d/Y H:m:s] 
    ' if you prefer other format, i.e. [d.m.Y H:m:s] switch mid offsets 
    fromDate = Mid(wmiDate,5,2) & "/" & Mid(wmiDate,7,2) & "/" & Left(wmiDate,4) 
    fromTime = Mid(wmiDate,9,2) & ":" & Mid(wmiDate,11,2) & ":" & Mid(wmiDate,13,2) 

    toDate = Date & " " & Time 

    response.write(DateDiff("d",fromDate & " " & fromTime,toDate) & " Days<br />") 
    response.write(DateDiff("h",Date & " " & fromTime,toDate) & " Hours<br />") 

%> 

Он использует Mid() и Left() функции разделить даты WMI в необходимых деталей для VBScript. Затем функция DateDiff() доставляет разность интервалов сначала для d = дней, а затем для h = часов. Вы заметите, что при вычислении часов я просто использовал временную часть строки WMI, так как мы уже рассчитали разницу в днях, нам осталось только часа.

Интересной статья объяснения VBScript Date and Time (Iso Formats)

Как комментарий был так любезно замечание формата даты я использовал и результат расчета часов, я добавил строку комментария объясняя формат дату я использовал (я использовал m/d/Y H:m:s но в зависимости от вашего места, вы можете предпочесть d.m.Y H:m:s, тогда вам необходимо поменять Mid() смещения, чтобы получить в порядке порядок). Я также добавил текущий Time к toDate и в расчете часа добавили ток Date, чтобы рассчитать правильную разницу во времени.

+0

С вашим решением я думаю, что DST не будет рассматриваться. –

+0

@rora для часового пояса можно легко проанализировать последние три цифры и вычесть их из минут «-Mid (wmiDate, 23)», как [объяснено здесь] (http://www.merlyn.demon.co.uk/vb- date1.htm # IF). Таким образом, вы можете получить более точную информацию только со строками и функциями даты без другого объекта сценария. –

+0

Этот код абсолютно бесполезен. Позиции для временных частей ошибочны, вычисление «h» не выполняется, потому что fromTime имеет дату с 1899 года. –

3

Следующая простая функция должна работать для любого аргумента в действительном CIM_DATETIME format.

Function WMIDateStringToDate(dtmDate) 
WMIDateStringToDate = (Left(dtmDate, 4) _ 
    & "/" & Mid(dtmDate, 5, 2) _ 
    & "/" & Mid(dtmDate, 7, 2) _ 
    & " " & Mid(dtmDate, 9, 2) _ 
    & ":" & Mid(dtmDate,11, 2) _ 
    & ":" & Mid(dtmDate,13, 2)) 
End Function 

Пример:

InstallDate (wmi): 20141205231553.000000+060 
InstallDate:  2014/12/05 23:15:53 

Однако wmi запрос может возвращать Null, например, VarType(dtmDate)=1 для конкретного экземпляра даты; В следующем скрипте функция изменения:

option explicit 
Dim strWmiDate 
strWmiDate = "20141103113859.220250+060" 
Wscript.Echo strWmiDate _ 
    & vbNewLine & WMIDateStringToDate(strWmiDate) _ 
    & vbNewLine & DateDiff("d", WMIDateStringToDate(strWmiDate), Now) _ 
    & vbNewLine _ 
    & vbNewLine & WMIDateStringToDate(Null) _ 
    & vbNewLine & DateDiff("d", WMIDateStringToDate(Null), Now) 



Function WMIDateStringToDate(byVal dtmDate) 
    If VarType(dtmDate)=1 Then 
     WMIDateStringToDate = FormatDateTime(Now) 'change to whatever you want 
    Else 
     ' 
     ' to keep script locale independent: 
     ' returns ANSI (ISO 8601) datetime format (24 h) 
     ' 
     ' yyyy-mm-dd HH:MM:SS 
     ' 
     WMIDateStringToDate = Left(dtmDate, 4) _ 
      & "-" & Mid(dtmDate, 5, 2) _ 
      & "-" & Mid(dtmDate, 7, 2) _ 
      & " " & Mid(dtmDate, 9, 2) _ 
      & ":" & Mid(dtmDate,11, 2) _ 
      & ":" & Mid(dtmDate,13, 2) 
    End If 
End Function 

Выход:

==>cscript 29535638.vbs 
20141103113859.220250+060 
2014-11-03 11:38:59 
157 

09.04.2015 15:36:38 
0 
+1

Это очень хорошая идея: «сохранить независимость от сценария», , Но, возвращая ** строку ** из WMIDateStringToDate (а не дату, как было обещано), вы должны надеяться, что все вычисления/неявные преобразования в кодовом коде будут успешными для всех локалей. Вместо этого используйте DateSerial + TimeSerial. –

4

От Помощь

Используйте SWbemDateTime объект преобразовать их в обычные даты и времени. Windows 2000/NT и Windows 98/95: SWbemDateTime недоступен. Чтобы преобразовать даты WMI в формат FILETIME или VT_DATE или проанализировать дату в компонентном году, месяце, дне, часах и т. Д., Вы должны написать свой собственный код.

Set dtmInstallDate = CreateObject(_ 
    "WbemScripting.SWbemDateTime") 
strComputer = "." 
Set objWMIService = GetObject(_ 
    "winmgmts:\\" & strComputer & "\root\cimv2") 
Set objOS = objWMIService.ExecQuery(_ 
    "Select * from Win32_OperatingSystem") 
For Each strOS in objOS 
    dtmInstallDate.Value = strOS.InstallDate 
    Wscript.Echo dtmInstallDate.GetVarDate 
Next 

Чтобы получить помощь.

http://msdn.microsoft.com/en-us/windows/hardware/hh852363

Установите Windows SDK, а просто выбрать документацию.

1

@ Серьезность дала такой же ответ, пока я писала, но ...

Option Explicit 

    WScript.Echo getLastBootUpTime() 
    WScript.Echo WMIDate2Date("20141103113859.220250+060") 
    WScript.Echo GetElapsedTime(getLastBootUpTime(), Now) 

Function WMIDate2Date(ByVal WMIDate) 
    With WScript.CreateObject("WbemScripting.SWbemDateTime") 
     .Value = WMIDate 
     WMIDate2Date = .GetVarDate(False) 
    End With 
End Function  

Function getLastBootUpTime() 
Dim oOS 
    For Each oOS In GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select LastBootUpTime from Win32_OperatingSystem") 
     getLastBootUpTime = WMIDate2Date(oOS.LastBootUpTime) 
    Next 
End Function 

Function GetElapsedTime(ByVal Date1, ByVal Date2) 
Dim seconds, aLabels, aValues, aDividers, i 
    aLabels = Array(" days, ", ":", ":", "") 
    aDividers = Array(86400, 3600, 60, 1) 
    aValues = Array(0, 0, 0, 0) 
    i = 0 
    seconds = Abs(DateDiff("s", Date1, Date2)) 
    Do While seconds > 0 
     aValues(i) = Fix(seconds/aDividers(i)) 
     seconds = seconds - aValues(i) * aDividers(i) 
     aValues(i) = CStr(aValues(i)) & aLabels(i) 
     i=i+1 
    Loop 
    GetElapsedTime = Join(aValues, "") 
End Function 
Смежные вопросы