C# Core 3.1 WinForms读取系统安装日期与CMD结果不一致问题
解决注册表读取InstallDate与systeminfo结果不一致的问题
你遇到的问题核心是时间戳类型不匹配:
注册表中InstallDate的值是Unix时间戳(从1970年1月1日00:00:00 UTC开始累计的秒数),但你的代码错误使用了DateTime.FromFileTimeUtc方法——这个方法专门用于解析Windows文件时间(以1601年1月1日为起点、100纳秒为间隔的计数),两种时间戳的起点和单位完全不同,因此得到了错误的日期。
正确解决方案
需要将Unix时间秒数转换为DateTime,步骤如下:
- 读取
InstallDate的DWORD值(32位无符号整数) - 以Unix纪元(1970-01-01 00:00:00 UTC)为基准,累加对应的秒数得到正确时间
修正后的代码
RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, computerName); key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false); if (key != null) { object installValue = key.GetValue("InstallDate"); // InstallDate是DWORD类型,对应C#的uint if (installValue is uint unixSeconds) { // 从Unix时间戳转换为UTC时间 DateTime installDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc) .AddSeconds(unixSeconds); // 如果需要和systeminfo显示的本地时间一致,可转换为本地时区 // return installDate.ToLocalTime(); return installDate; } } return DateTime.MinValue;
补充说明
- systeminfo命令显示的是本地时区的安装时间,若要和其完全匹配,需将转换后的UTC时间调用
ToLocalTime()转为本地时间 - 注意
InstallDate的DWORD类型是32位无符号整数,直接转换为long时要避免溢出,建议先以uint接收再处理
内容的提问来源于stack exchange,提问作者Musa Tilki
相关产品推荐
相关产品推荐

