У меня есть последнее время загрузки от WMI, и это выглядит как '20141103113859.220250 + 060'. Я хочу преобразовать его в количество дней и времени с текущего времени.vbscript: как конвертировать дату в дни и время
Возможно ли это?
У меня есть последнее время загрузки от WMI, и это выглядит как '20141103113859.220250 + 060'. Я хочу преобразовать его в количество дней и времени с текущего времени.vbscript: как конвертировать дату в дни и время
Возможно ли это?
Вы не столкнетесь с разделом строки даты 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
, чтобы рассчитать правильную разницу во времени.
Следующая простая функция должна работать для любого аргумента в действительном 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
Это очень хорошая идея: «сохранить независимость от сценария», , Но, возвращая ** строку ** из WMIDateStringToDate (а не дату, как было обещано), вы должны надеяться, что все вычисления/неявные преобразования в кодовом коде будут успешными для всех локалей. Вместо этого используйте DateSerial + TimeSerial. –
От Помощь
Используйте 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, а просто выбрать документацию.
@ Серьезность дала такой же ответ, пока я писала, но ...
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
С вашим решением я думаю, что DST не будет рассматриваться. –
@rora для часового пояса можно легко проанализировать последние три цифры и вычесть их из минут «-Mid (wmiDate, 23)», как [объяснено здесь] (http://www.merlyn.demon.co.uk/vb- date1.htm # IF). Таким образом, вы можете получить более точную информацию только со строками и функциями даты без другого объекта сценария. –
Этот код абсолютно бесполезен. Позиции для временных частей ошибочны, вычисление «h» не выполняется, потому что fromTime имеет дату с 1899 года. –