⏱ TimeSpan:C#时间间隔结构

在 .NET 开发中,除了 DateTime 表示具体时间点,TimeSpan 是我们常用的另一个结构,用于表示两个时间点之间的"间隔"或"持续时间"。

无论是倒计时、超时判断、定时逻辑,还是两个事件的间隔计算,TimeSpan 都扮演着关键角色。


一、TimeSpan 是什么?

复制代码
public struct TimeSpan : IComparable, IComparable<TimeSpan>, IEquatable<TimeSpan>, IFormattable

表示一个时间段或时间长度,可以是正值(向未来)、负值(向过去),例如:

  • 30 分钟

  • -2 小时

  • 3 天 5 小时

TimeSpan 不是时间点,而是两个时间点之间的差


二、构造 TimeSpan

1. 通过构造函数(手动填写)

复制代码
TimeSpan span1 = new TimeSpan(1, 2, 30); // 1小时 2分钟 30秒
TimeSpan span2 = new TimeSpan(5, 12, 30, 45); // 5天 12小时 30分 45秒

2. 推荐方式:通过静态方法创建

复制代码
TimeSpan fromHours = TimeSpan.FromHours(1.5);       // 1 小时 30 分
TimeSpan fromMinutes = TimeSpan.FromMinutes(45);    // 45 分钟
TimeSpan fromSeconds = TimeSpan.FromSeconds(10);    // 10 秒
TimeSpan fromDays = TimeSpan.FromDays(2);           // 2 天
TimeSpan fromMilliseconds = TimeSpan.FromMilliseconds(500); // 500 毫秒

三、从 DateTime 获取 TimeSpan

复制代码
DateTime start = new DateTime(2025, 8, 7, 9, 0, 0);
DateTime end = new DateTime(2025, 8, 7, 12, 30, 0);

TimeSpan diff = end - start; // 时间差
Console.WriteLine(diff);     // 03:30:00

也可以和当前时间对比:

复制代码
TimeSpan ago = DateTime.Now - start;

四、TimeSpan 的组成部分

复制代码
TimeSpan span = new TimeSpan(1, 12, 30, 45, 500); // 1天12小时30分45秒500毫秒
属性 类型 示例值 说明
Days int 1 天数部分
Hours int 12 小时部分
Minutes int 30 分钟部分
Seconds int 45 秒数部分
Milliseconds int 500 毫秒部分
Ticks long - 总 Tick 数(1 Tick = 100ns)
TotalDays double 1.521 总天数(含小数)
TotalHours double 36.5 总小时
TotalMinutes double 2190 总分钟
TotalSeconds double 131400 总秒数
TotalMilliseconds double 131400500 总毫秒数

五、加减操作

1. TimeSpan 与 DateTime 相加减

复制代码
DateTime now = DateTime.Now;
DateTime later = now + TimeSpan.FromMinutes(10);
DateTime earlier = now - TimeSpan.FromHours(1);

2. TimeSpan 与 TimeSpan 相加减

复制代码
TimeSpan a = TimeSpan.FromMinutes(30);
TimeSpan b = TimeSpan.FromMinutes(45);

TimeSpan total = a + b; // 1小时15分
TimeSpan diff = a - b;  // -15分钟

六、比较 TimeSpan

复制代码
TimeSpan a = TimeSpan.FromHours(1);
TimeSpan b = TimeSpan.FromMinutes(90);

bool isShorter = a < b;              // true
bool isEqual = a == b;               // false
int result = TimeSpan.Compare(a, b); // -1 表示 a 小于 b

七、格式化输出

默认格式

复制代码
TimeSpan span = new TimeSpan(1, 2, 3);
Console.WriteLine(span); // 输出 "01:02:03"

自定义格式

复制代码
TimeSpan span = new TimeSpan(1, 2, 3);

string custom = span.ToString(@"hh\:mm\:ss"); // "01:02:03"
string full = span.ToString(@"d\.hh\:mm\:ss"); // "0.01:02:03"

\: 是转义字符,用于保留冒号,否则会报错。


八、解析字符串为 TimeSpan

复制代码
TimeSpan t1 = TimeSpan.Parse("02:30:00");

bool success = TimeSpan.TryParse("not valid", out TimeSpan t2); // 不抛异常

九、实际开发常用场景

场景 示例
计算两个时间差 TimeSpan diff = end - start;
判断是否过期 if (DateTime.Now - created > TimeSpan.FromMinutes(30))
倒计时 TimeSpan left = deadline - DateTime.Now;
格式化显示 span.ToString(@"hh\:mm\:ss")
定时触发逻辑 yield return new WaitForSeconds((float)span.TotalSeconds);

十、小结

项目 说明
类型 System.TimeSpan
表示 时间间隔(可为负)
构造 构造函数 或 TimeSpan.FromXxx()
单位 Tick(100 纳秒)
精度 毫秒 ~ 纳秒
常用于 时间差计算、倒计时、调度逻辑

🕒 十一、常见成员总结

复制代码
TimeSpan ts = new TimeSpan(1, 2, 3, 4, 567); // 1天2小时3分4秒567毫秒

🧮 1. Days

返回时间间隔中的 "天"部分

复制代码
int days = ts.Days; // 1

⏰ 2. Hours

返回除去天数后的 "小时"部分

复制代码
int hours = ts.Hours; // 2

⏱️ 3. Minutes

返回除天和小时以外的 "分钟"部分

复制代码
int minutes = ts.Minutes; // 3

🕐 4. Seconds

返回除天、小时、分钟之外的 "秒"部分

复制代码
int seconds = ts.Seconds; // 4

🧩 5. Milliseconds

返回时间间隔中的 "毫秒"部分

复制代码
int ms = ts.Milliseconds; // 567

📏 6. TotalDays

返回 总天数,包括小数部分。

复制代码
double totalDays = ts.TotalDays; // 1.085...

📘 7. TotalHours

返回 总小时数

复制代码
double totalHours = ts.TotalHours; // 26.085...

📗 8. TotalMinutes

返回 总分钟数

复制代码
double totalMinutes = ts.TotalMinutes; // 1565.085...

📙 9. TotalSeconds

返回 总秒数

复制代码
double totalSeconds = ts.TotalSeconds; // 93904.567

📕 10. TotalMilliseconds

返回 总毫秒数

复制代码
double totalMilliseconds = ts.TotalMilliseconds; // 93904567

🔤 11. ToString()

格式化为 标准字符串

复制代码
string str = ts.ToString(); // "1.02:03:04.567"
相关推荐
百锦再4 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君4 小时前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再4 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
易安说AI4 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI4 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI4 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
暖馒5 小时前
Modbus应用层协议的深度剖析
网络·网络协议·c#·wpf·智能硬件
颜酱5 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
失忆爆表症6 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui
小迷糊的学习记录6 小时前
Vuex 与 pinia
前端·javascript·vue.js