⏱ 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"
相关推荐
Java中文社群10 分钟前
快看!百度提前批的面试难度,你能拿下吗?
java·后端·面试
不远处的小阿秋11 分钟前
2025年,前端还需要虚拟DOM吗
前端
DcTbnk17 分钟前
tailwindcss、postcss、autoprefixer,这三个分别是干嘛的
前端
zReadonly22 分钟前
antdv@4.x在360极速浏览器兼容解决办法
前端
yede25 分钟前
页面中模块通讯简单实现
前端·javascript·html
前端Hardy32 分钟前
HTML&CSS&JS:超级惊艳的全屏图片轮播效果
前端·javascript·css
用户975142815002138 分钟前
实现页面在移动端自适应的方法总结
前端·css
二闹1 小时前
面试官经常问的ArrayList 和 LinkedList的区别
后端
pe7er1 小时前
使用RealFaviconGenerator.net一站式生成各平台兼容 Favicon
前端
用户2519162427111 小时前
Canvas之贪吃蛇
前端·javascript·canvas