【问题标题】:How to convert WMI DateTime to standard DateTime?如何将 WMI DateTime 转换为标准 DateTime?
【发布时间】:2009-12-20 13:01:59
【问题描述】:

我正在尝试从 WMI (Win32_OperatingSystem.InstallDate) 读取安装日期。返回值如下所示:20091020221246.000000+180。如何获得有效的日期?

【问题讨论】:

标签: delphi datetime wmi


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    Magenta Systems 的 MagWMI 包含执行此操作的 MagWmiDate2DT()。

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

    【讨论】:

      【解决方案3】:
      System.Management.ManagementDateTimeConverter.ToDateTime
      

      【讨论】:

        【解决方案4】:

        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;
        

        【讨论】:

          【解决方案5】:

          【讨论】:

          • 也许有用,也许没用。请在 Stack Overflow 总结答案。
          猜你喜欢
          • 2021-06-17
          • 2019-12-26
          • 2020-03-04
          • 1970-01-01
          • 2021-03-31
          • 2020-06-19
          • 1970-01-01
          • 2015-04-29
          • 2023-03-21
          相关资源
          最近更新 更多