代码之家  ›  专栏  ›  技术社区  ›  Remus Rigo

如何将wmi datetime转换为标准datetime?

  •  4
  • Remus Rigo  · 技术社区  · 15 年前

    我正在尝试从wmi读取安装日期( Win32_OperatingSystem.InstallDate )返回值如下:20091020221246.000000+180。我怎样才能得到一个有效的日期?

    5 回复  |  直到 12 年前
        1
  •  -1
  •   Joe Meyer    15 年前
        2
  •  5
  •   RRUZ    13 年前

    您可以使用 WbemScripting.SWbemDateTime 对象。

    检查这个样品

    function  WmiDateToTDatetime(vDate : OleVariant) : TDateTime;
    var
      FWbemDateObj  : OleVariant;
    begin;
      FWbemDateObj  := CreateOleObject('WbemScripting.SWbemDateTime');
      FWbemDateObj.Value:=vDate;
      Result:=FWbemDateObj.GetVarDate;
    end;
    

    有关此主题的详细信息,请阅读此文章 WMI Tasks using Delphi – Dates and Times

        3
  •  3
  •   davea    15 年前

    洋红色系统中的magwmi包含执行此操作的magwmidate2dt()。

    http://www.magsys.co.uk/delphi/magwmi.asp

        4
  •  1
  •   sth Alien    14 年前
    System.Management.ManagementDateTimeConverter.ToDateTime
    
        5
  •  1
  •   Dmitriy    12 年前

    wbemscripting.swbemdatetime并不总是有效。更好的方法:

    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;