如何将 WMI 日期时间转换为标准日期时间?

发布于 2024-08-15 16:19:59 字数 121 浏览 3 评论 0原文

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

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

七月上 2024-08-22 16:19:59

您可以使用 WbemScripting.SWbemDateTime 对象。

检查此示例

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

有关此主题的更多信息,您可以阅读这篇文章 使用 Delphi 的 WMI 任务 – 日期和时间

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

或十年 2024-08-22 16:19:59

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

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

MagWMI from Magenta Systems contains MagWmiDate2DT() that does this.

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

空袭的梦i 2024-08-22 16:19:59
System.Management.ManagementDateTimeConverter.ToDateTime
System.Management.ManagementDateTimeConverter.ToDateTime
不忘初心 2024-08-22 16:19:59

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;

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文