You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,步骤如下:

  1. 读取InstallDate的DWORD值(32位无符号整数)
  2. 以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:30:38