在C#开发里,获取电脑开机运行时长或者系统启动时间是比较常见的需求,不同的实现方式有着不同的特点和适用场景,下面会逐一介绍具体的实现方案。

方案一:使用PerformanceCounter获取系统启动时间
Windows系统提供了性能计数器功能,其中System类别下的System Up Time计数器可以直接返回系统启动后经过的秒数,这种方式获取的数据比较准确,兼容性也不错。
实现步骤如下:
- 引入
System.Diagnostics命名空间 - 创建
PerformanceCounter实例,指定类别名、计数器名 - 读取计数器的值并转换为需要的格式
完整代码如下:
using System;
using System.Diagnostics;
namespace GetSystemStartupTime
{
class Program
{
static void Main(string[] args)
{
try
{
// 创建性能计数器实例,类别为System,计数器为System Up Time
PerformanceCounter pc = new PerformanceCounter("System", "System Up Time");
// 首次调用NextValue()返回0,需要调用第二次获取实际值
pc.NextValue();
float upTimeSeconds = pc.NextValue();
// 转换为时分秒格式
TimeSpan upTime = TimeSpan.FromSeconds(upTimeSeconds);
Console.WriteLine("系统启动时间(性能计数器方式):");
Console.WriteLine($"开机运行时长:{upTime.Days}天 {upTime.Hours}小时 {upTime.Minutes}分钟 {upTime.Seconds}秒");
// 计算系统启动的具体时间
DateTime startupTime = DateTime.Now.Subtract(upTime);
Console.WriteLine($"系统启动时间:{startupTime:yyyy-MM-dd HH:mm:ss}");
}
catch (Exception ex)
{
Console.WriteLine($"获取失败:{ex.Message}");
}
}
}
}
方案二:使用Environment.TickCount获取开机运行时长
Environment.TickCount属性返回系统启动后经过的毫秒数,这个值是从系统启动开始计算的,但是需要注意该值是32位有符号整数,大约24.9天会溢出重置,所以更适合短时间内的运行时长获取。
实现逻辑很简单,直接读取该属性值,然后转换为时分秒格式即可,完整代码如下:
using System;
namespace GetSystemStartupTime
{
class Program
{
static void Main(string[] args)
{
// 获取系统启动后的毫秒数
int tickCount = Environment.TickCount;
// 转换为TimeSpan
TimeSpan upTime = TimeSpan.FromMilliseconds(tickCount);
Console.WriteLine("系统启动时间(TickCount方式):");
Console.WriteLine($"开机运行时长:{upTime.Days}天 {upTime.Hours}小时 {upTime.Minutes}分钟 {upTime.Seconds}秒");
// 计算系统启动的具体时间
DateTime startupTime = DateTime.Now.Subtract(upTime);
Console.WriteLine($"系统启动时间:{startupTime:yyyy-MM-dd HH:mm:ss}");
}
}
}
两种方案对比
我们可以通过表格对比两种方案的特点,方便开发者根据实际场景选择:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| PerformanceCounter方式 | 数据准确,无溢出问题,支持长时间运行 | 需要引入Diagnostics命名空间,部分精简系统可能缺少对应计数器 | 需要长期监控系统运行时长,对准确性要求高的场景 |
| Environment.TickCount方式 | 实现简单,无需额外依赖,性能消耗低 | 32位整数约24.9天溢出,精度为毫秒级 | 短时间内的运行时长获取,轻量级工具开发 |
注意事项
- 使用PerformanceCounter时,首次调用
NextValue()方法会返回0,需要调用第二次才能获取到实际值,这是性能计数器的特性导致的。 - 如果系统运行时间超过24.9天,使用
Environment.TickCount会出现数值溢出,此时可以改用Environment.TickCount64属性,它是64位整数,不会出现溢出问题,代码只需要把int tickCount = Environment.TickCount;改为long tickCount = Environment.TickCount64;即可。 - 计算系统启动时间时,使用的是当前时间减去运行时长,所以如果当前系统时间被修改过,计算出的启动时间也会不准确,这是两种方案都存在的局限性。
C#系统启动时间开机运行时长PerformanceCounterEnvironment_TickCount修改时间:2026-07-24 04:24:12