0

0

C#怎么获取电脑的开机运行时长_C#如何读取系统启动时间【代码】

尼克

尼克

发布时间:2026-03-15 17:26:02

|

755人浏览过

|

来源于php中文网

原创

Environment.TickCount64返回系统启动至今毫秒数,轻量跨平台但休眠时暂停计数;WMI方式通过Win32_OperatingSystem.LastBootUpTime获取真实启动时间,需管理员权限且依赖WMI服务;GetTickCount64 P/Invoke更底层但仅限Windows。

c#怎么获取电脑的开机运行时长_c#如何读取系统启动时间【代码】

Environment.TickCount64 获取开机时长(毫秒级,简单但有坑)

这是最轻量、无需权限、跨 .NET Core/.NET 5+ 的方式,返回系统启动至今的毫秒数。但它本质是“自进程启动后经过的毫秒”,不是绝对开机时间——如果系统运行超 24.8 天,TickCount 会溢出回绕(TickCount64 已解决此问题,但旧代码若误用 TickCount 就会错)。

  • 只适用于本机进程运行期间的相对时长估算,不能反推精确启动时间点
  • Environment.TickCount64 是 64 位有符号整数,理论支持约 292 年,实际无溢出风险
  • 注意:它不等于「系统 uptime」,比如休眠期间该计数器会暂停(Windows 默认行为),所以结果偏小
  • 示例:
    long upMs = Environment.TickCount64; // 如 1234567890 毫秒 ≈ 14.3 天

ManagementObjectSearcher 查询 Win32_OperatingSystem(需引用 System.Management)

这是获取真实系统启动时间点的主流做法,能拿到 LastBootUpTime(WMI 格式字符串),再转成 DateTime。但它依赖 WMI 服务、需要管理员权限(部分环境会拒绝访问)、在容器或精简系统中可能不可用。

  • 必须添加 NuGet 包 System.Management(.NET Core 3.1+ 起需单独引用)
  • LastBootUpTime 是形如 "20240512102345.000000+480" 的 CIM datetime 字符串,需手动解析
  • 常见错误:直接用 Convert.ToDateTime() 会抛 FormatException;正确做法是用 ManagementDateTimeConverter.ToDateTime()
  • 示例:
    var searcher = new ManagementObjectSearcher("SELECT LastBootUpTime FROM Win32_OperatingSystem");<br>foreach (ManagementObject obj in searcher.Get()) {<br>  string wmiTime = obj["LastBootUpTime"]?.ToString();<br>  DateTime bootTime = ManagementDateTimeConverter.ToDateTime(wmiTime);<br>  TimeSpan upTime = DateTime.Now - bootTime;<br>}

GetTickCount64 P/Invoke(更底层,但要小心平台兼容性)

这是 Windows 原生 API,和 Environment.TickCount64 底层一致,但你能自己控制调用时机、避免 .NET 运行时初始化延迟影响。不过它只在 Windows 上有效,Linux/macOS 下会报 DllNotFoundException

小羊标书
小羊标书

一键生成百页标书,让投标更简单高效

下载
  • 需声明 [DllImport("kernel32.dll")] public static extern ulong GetTickCount64();
  • 返回值是 ulong,比 Environment.TickCount64long)多一位,但实际意义相同
  • 关键区别:它不受 .NET 进程启动时机影响,只要系统没重启,每次调用都反映真实内核 uptime
  • 仍受休眠影响(Windows 内核计数器在睡眠时暂停)
  • 别用 GetTickCount(32 位),它每 ~49.7 天就回绕一次,极易出错

为什么不用 PerformanceCounter

有人试过用 PerformanceCounter("System", "System Up Time"),理论上可行,但实际踩坑极多:首次实例化慢(WMI 初始化开销)、需要 Performance Logs & Alerts 权限、在某些组策略锁定的域环境中默认禁用、.NET 6+ 在非 Windows 平台会直接 throw PlatformNotSupportedException

  • 该计数器值本质也是从 Win32_OperatingSystem.LastBootUpTime 计算而来,多一层封装无必要
  • 错误现象典型:InvalidOperationException: Counter is not supported on this platform 或卡在构造函数
  • 除非你已经在用大量性能计数器且确认环境可控,否则绕开它更省心

真正麻烦的是休眠——所有基于内核 tick 的方法都会把休眠时间算作“停机”,而用户问的“开机运行时长”往往指“通电持续时间”。这种需求只能靠硬件日志或事件查看器解析 System 日志里 ID=12 的 Kernel-General 事件,那已经超出单行代码范畴了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1229

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1205

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

131

2025.08.07

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号