在C#中使用TimeSpan
在 C# 中,TimeSpan 结构用于表示时间间隔,即两个时间点之间的差值。它可以表示正数或负数的时间跨度,支持从纳秒到天数的精确度量。
主要特点:
- 表示范围:可表示从
-10675199.02:48:05.4775808到10675199.02:48:05.4775807的时间间隔 - 精度:最高可达 100 纳秒
- 不可变:创建后无法修改其值,所有操作都会返回新的
TimeSpan对象
常用属性:
Days:获取当前TimeSpan结构所表示的整天数Hours:获取当前TimeSpan结构所表示的小时数(0-23)Minutes:获取当前TimeSpan结构所表示的分钟数(0-59)Seconds:获取当前TimeSpan结构所表示的秒数(0-59)Milliseconds:获取当前TimeSpan结构所表示的毫秒数(0-999)Ticks:获取表示时间间隔的刻度数(1 刻度 = 100 纳秒)TotalDays:获取以整天数和天的小数部分表示的时间间隔值TotalHours:获取以总小时数表示的时间间隔值TotalMinutes:获取以总分钟数表示的时间间隔值TotalSeconds:获取以总秒数表示的时间间隔值TotalMilliseconds:获取以总毫秒数表示的时间间隔值
常用方法:
Add(TimeSpan):返回一个新的TimeSpan,其值为当前实例与指定的TimeSpan之和Subtract(TimeSpan):返回一个新的TimeSpan,其值为当前实例减去指定的TimeSpanDuration():返回当前TimeSpan的绝对值Negate():返回当前TimeSpan的相反数FromDays(double)、FromHours(double)等静态方法:从指定值创建TimeSpan
使用示例:
// 创建 TimeSpan 的几种方式
TimeSpan ts1 = new TimeSpan(2, 14, 35); // 2小时14分35秒
TimeSpan ts2 = TimeSpan.FromHours(2.5); // 2.5小时
TimeSpan ts3 = new DateTime(2023, 10, 1) - new DateTime(2023, 9, 1); // 两个日期的差
// 常用操作
TimeSpan sum = ts1.Add(ts2);
double totalMinutes = ts1.TotalMinutes;
int hours = ts1.Hours;
// 格式化输出
Console.WriteLine(ts1.ToString()); // 02:14:35
Console.WriteLine(ts3.ToString("d'.'hh':'mm")); // 30.00:00
C# 的 TimeSpan 结构提供了丰富的方法用于处理时间间隔,以下是其主要方法的详细介绍及使用示例:
一、静态方法(创建 TimeSpan 对象)
-
FromDays(double value)
从指定的天数创建TimeSpan。TimeSpan ts = TimeSpan.FromDays(2.5); // 2天12小时(0.5天=12小时) Console.WriteLine(ts); // 2.12:00:00 -
FromHours(double value)
从指定的小时数创建TimeSpan。TimeSpan ts = TimeSpan.FromHours(1.5); // 1小时30分钟 Console.WriteLine(ts); // 01:30:00 -
FromMinutes(double value)
从指定的分钟数创建TimeSpan。TimeSpan ts = TimeSpan.FromMinutes(90); // 1小时30分钟 Console.WriteLine(ts); // 01:30:00 -
FromSeconds(double value)
从指定的秒数创建TimeSpan。TimeSpan ts = TimeSpan.FromSeconds(150); // 2分钟30秒 Console.WriteLine(ts); // 00:02:30 -
FromMilliseconds(double value)
从指定的毫秒数创建TimeSpan。TimeSpan ts = TimeSpan.FromMilliseconds(1500); // 1秒500毫秒 Console.WriteLine(ts); // 00:00:01.5000000 -
FromTicks(long value)
从指定的刻度数创建TimeSpan(1 刻度 = 100 纳秒)。TimeSpan ts = TimeSpan.FromTicks(10000000); // 1秒(1秒=10,000,000刻度) Console.WriteLine(ts); // 00:00:01 -
Parse(string s) / ParseExact(string s, string format, IFormatProvider provider)
将字符串解析为TimeSpan。TimeSpan ts1 = TimeSpan.Parse("1.02:30:45"); // 1天2小时30分45秒 Console.WriteLine(ts1); // 1.02:30:45 // 按指定格式解析 TimeSpan ts2 = TimeSpan.ParseExact("2h30m", "hh\\hm\\m", null); Console.WriteLine(ts2); // 02:30:00 -
TryParse(string s, out TimeSpan result) / TryParseExact(...)
尝试解析字符串,解析成功返回true,失败返回false(避免抛出异常)。bool success = TimeSpan.TryParse("abc", out TimeSpan ts); Console.WriteLine(success); // False(解析失败)
二、实例方法(操作 TimeSpan 对象)
-
Add(TimeSpan value)
累加两个时间间隔,返回新的TimeSpan(原对象不变,因TimeSpan不可变)。TimeSpan ts1 = TimeSpan.FromHours(2); TimeSpan ts2 = TimeSpan.FromMinutes(30); TimeSpan sum = ts1.Add(ts2); // 2小时 + 30分钟 = 2.5小时 Console.WriteLine(sum); // 02:30:00 -
Subtract(TimeSpan value)
从当前时间间隔中减去另一个,返回新的TimeSpan。TimeSpan ts1 = TimeSpan.FromHours(3); TimeSpan ts2 = TimeSpan.FromMinutes(45); TimeSpan diff = ts1.Subtract(ts2); // 3小时 - 45分钟 = 2小时15分钟 Console.WriteLine(diff); // 02:15:00 -
Multiply(double factor)
将时间间隔乘以指定倍数(.NET 5+ 支持)。TimeSpan ts = TimeSpan.FromMinutes(10); TimeSpan multiplied = ts.Multiply(3); // 10分钟 × 3 = 30分钟 Console.WriteLine(multiplied); // 00:30:00 -
Divide(double divisor)
将时间间隔除以指定数值(.NET 5+ 支持)。TimeSpan ts = TimeSpan.FromMinutes(30); TimeSpan divided = ts.Divide(2); // 30分钟 ÷ 2 = 15分钟 Console.WriteLine(divided); // 00:15:00 -
Duration()
返回当前时间间隔的绝对值(无论原间隔为正或负)。TimeSpan ts = TimeSpan.FromHours(-2); TimeSpan abs = ts.Duration(); // 取绝对值 Console.WriteLine(abs); // 02:00:00 -
Negate()
返回当前时间间隔的相反数(正负反转)。TimeSpan ts = TimeSpan.FromHours(2); TimeSpan negated = ts.Negate(); // 反转符号 Console.WriteLine(negated); // -02:00:00 -
CompareTo(TimeSpan value)
比较当前实例与另一个TimeSpan,返回:- 正数:当前实例更大;
- 0:相等;
- 负数:当前实例更小。
TimeSpan ts1 = TimeSpan.FromHours(2); TimeSpan ts2 = TimeSpan.FromHours(3); int result = ts1.CompareTo(ts2); // 2小时 < 3小时 → 返回 -1 -
Equals(TimeSpan value)
判断当前实例与指定TimeSpan是否相等(值比较)。TimeSpan ts1 = TimeSpan.FromHours(2); TimeSpan ts2 = TimeSpan.FromMinutes(120); bool isEqual = ts1.Equals(ts2); // 2小时 = 120分钟 → True -
ToString()
将TimeSpan转换为字符串(支持格式化)。TimeSpan ts = new TimeSpan(1, 2, 30, 45); // 1天2小时30分45秒 Console.WriteLine(ts.ToString()); // "1.02:30:45" Console.WriteLine(ts.ToString("d'天'h'小时'")); // "1天2小时"
三、总结
TimeSpan 的方法可分为两类:
- 静态方法:主要用于创建
TimeSpan对象(如FromXxx、Parse系列); - 实例方法:主要用于时间间隔的计算(如
Add、Subtract)、比较(CompareTo)、转换(ToString)等。