xiaojin093 2023-08-02 18:03 采纳率: 53.3%
浏览 7
已结题

c#获取系统开机时间

用如下代码获取系统开机时间,获取到的不正确,感觉获取的是上次系统的开机时间,而不是本次的开机时间,

测试了下,电脑开机,马上查看Environment.TickCount值,理论上Environment.TickCount值应该比较小,但实际获取的Environment.TickCount值比较大,感觉得到的是距上次系统开机的时间,而不是本次的,
如果是重启系统,而非关机再开机,那么获取的Environment.TickCount值基本上都是正确的。
请指教下Environment.TickCount究竟是表示什么值,有什么方法可以正确获取系统本次开机的时间?

DateTime dt = DateTime.Now.AddMilliseconds(0 - Environment.TickCount);
Console.WriteLine("开机时间:"+ dt.ToString());
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-02 20:27
    关注

    【以下回答由 ChatGPT 生成】

    Environment.TickCount返回的是从系统启动到现在所经过的毫秒数,并不是系统本次开机的时间。要获取系统本次开机的时间,可以使用System.Diagnostics命名空间中的Process.StartTime属性。

    下面是使用C#获取系统本次开机时间的代码:

    using System;
    using System.Diagnostics;
    
    class Program
    {
        static void Main(string[] args)
        {
            TimeSpan uptime = DateTime.Now - GetLastBootTime();
            Console.WriteLine("本次开机时间:" + uptime.ToString());
        }
    
        static DateTime GetLastBootTime()
        {
            using (var process = new Process())
            {
                process.StartInfo.FileName = "cmd.exe";
                process.StartInfo.Arguments = "/c systeminfo | find \"System Boot Time\"";
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.CreateNoWindow = true;
                process.Start();
    
                string output = process.StandardOutput.ReadToEnd();
                string bootTimeStr = output.Substring(output.IndexOf(':') + 2);
                DateTime bootTime = DateTime.Parse(bootTimeStr);
    
                process.WaitForExit();
    
                return bootTime;
            }
        }
    }
    

    以上代码中,我们使用System.Diagnostics.Process启动一个命令行进程,执行systeminfo命令,并通过管道过滤出包含"System Boot Time"关键字的行。然后将输出结果解析为DateTime类型的系统开机时间。

    需要注意的是,此方法需要使用systeminfo命令,因此要求代码运行在具有足够权限的环境中。

    如果不能使用System.Diagnostics.Process获取系统开机时间,我们可以通过使用Windows Management Instrumentation (WMI)查询Win32_OperatingSystem类来获取系统开机时间。以下是使用WMI获取系统开机时间的代码示例:

    using System;
    using System.Management;
    
    class Program
    {
        static void Main(string[] args) 
        {
            TimeSpan uptime = DateTime.Now - GetLastBootTime();
            Console.WriteLine("本次开机时间:" + uptime.ToString());
        }
    
        static DateTime GetLastBootTime()
        {
            var scope = new ManagementScope("\\\\.\\root\\cimv2");
            var query = new ObjectQuery("SELECT LastBootUpTime FROM Win32_OperatingSystem");
    
            using (var searcher = new ManagementObjectSearcher(scope, query))
            using (var results = searcher.Get())
            {
                foreach (var item in results)
                {
                    var bootTimeStr = item["LastBootUpTime"].ToString();
                    var bootTime = ManagementDateTimeConverter.ToDateTime(bootTimeStr);
    
                    return bootTime;
                }
            }
    
            throw new Exception("Unable to retrieve system boot time.");
        }
    }
    

    以上代码使用WMI查询Win32_OperatingSystem类的LastBootUpTime属性,将其转换为DateTime类型的系统开机时间。

    这两种方法都可以获取到系统本次开机的时间,选择合适的方法取决于具体的需求和运行环境。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月8日
  • 已采纳回答 10月31日
  • 创建了问题 8月2日

悬赏问题

  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 Revit2020下载问题
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线