I'm trying to read the install date from WMI (Win32_OperatingSystem.InstallDate
). The return value looks like this: 20091020221246.000000+180. How can I get a valid Date?
Asked
Active
Viewed 3,131 times
4

Helen
- 87,344
- 17
- 243
- 314

Remus Rigo
- 1,454
- 8
- 34
- 60
-
2See http://stackoverflow.com/questions/1351483/what-format-is-this-time-value-in – Helen Dec 20 '09 at 16:28
5 Answers
5
Instead of parsing and extracting the values manually (how the accepted answer suggest), you can use the WbemScripting.SWbemDateTime
object.
check this sample
function WmiDateToTDatetime(vDate : OleVariant) : TDateTime;
var
FWbemDateObj : OleVariant;
begin;
FWbemDateObj := CreateOleObject('WbemScripting.SWbemDateTime');
FWbemDateObj.Value:=vDate;
Result:=FWbemDateObj.GetVarDate;
end;
For more info about this topic you can read this artile WMI Tasks using Delphi – Dates and Times

RRUZ
- 134,889
- 20
- 356
- 483
2
System.Management.ManagementDateTimeConverter.ToDateTime

sth
- 222,467
- 53
- 283
- 367

Khalid Rahaman
- 2,292
- 3
- 28
- 40
1
WbemScripting.SWbemDateTime does not always work. Better way:
function WmiDate2DT (S: string; var UtcOffset: integer): TDateTime ;
// yyyymmddhhnnss.zzzzzzsUUU +60 means 60 mins of UTC time
// 20030709091030.686000+060
// 1234567890123456789012345
var
yy, mm, dd, hh, nn, ss, zz: integer ;
timeDT: TDateTime ;
function GetNum (offset, len: integer): integer ;
var
E: Integer;
begin
Val (copy (S, offset, len), result, E) ;
end ;
begin
result := 0 ;
UtcOffset := 0 ;
if length (S) <> 25 then exit ; // fixed length
yy := GetNum (1, 4) ;
mm := GetNum (5, 2) ;
if (mm = 0) or (mm > 12) then exit ;
dd := GetNum (7, 2) ;
if (dd = 0) or (dd > 31) then exit ;
if NOT TryEncodeDate (yy, mm, dd, result) then // D6 and later
begin
result := -1 ;
exit ;
end ;
hh := GetNum (9, 2) ;
nn := GetNum (11, 2) ;
ss := GetNum (13, 2) ;
zz := 0 ;
if Length (S) >= 18 then zz := GetNum (16, 3) ;
if NOT TryEncodeTime (hh, nn, ss, zz, timeDT) then exit ; // D6 and later
result := result + timeDT ;
UtcOffset := GetNum (22, 4) ; // including sign
end ;
function VarDateToDateTime(const V: OleVariant): TDateTime;
var
rawdate: string ;
utcoffset: integer ;
begin
Result:=0;
if VarIsNull(V) then exit;
Dt.Value := V;
try
Result:=Dt.GetVarDate;
except
rawdate:=V;
result := WmiDate2DT (rawdate, utcoffset);
end;
end;

Dmitriy
- 11
- 1
-1
maybe this helps: http://technet.microsoft.com/en-us/library/ee156576.aspx

Joe Meyer
- 469
- 1
- 6
- 14
-
4Maybe it helps and maybe it doesn't. Please summarize the answer here at Stack Overflow. – Rob Kennedy Mar 07 '14 at 19:20