在 C# 中,TimeSpan 结构用于表示时间间隔,即两个时间点之间的差值。它可以表示正数或负数的时间跨度,支持从纳秒到天数的精确度量。

主要特点:

  1. 表示范围:可表示从 -10675199.02:48:05.477580810675199.02:48:05.4775807 的时间间隔
  2. 精度:最高可达 100 纳秒
  3. 不可变:创建后无法修改其值,所有操作都会返回新的 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,其值为当前实例减去指定的 TimeSpan
  • Duration():返回当前 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 对象)

  1. FromDays(double value)
    从指定的天数创建 TimeSpan

    TimeSpan ts = TimeSpan.FromDays(2.5); // 2天12小时(0.5天=12小时)
    Console.WriteLine(ts); // 2.12:00:00
    
  2. FromHours(double value)
    从指定的小时数创建 TimeSpan

    TimeSpan ts = TimeSpan.FromHours(1.5); // 1小时30分钟
    Console.WriteLine(ts); // 01:30:00
    
  3. FromMinutes(double value)
    从指定的分钟数创建 TimeSpan

    TimeSpan ts = TimeSpan.FromMinutes(90); // 1小时30分钟
    Console.WriteLine(ts); // 01:30:00
    
  4. FromSeconds(double value)
    从指定的秒数创建 TimeSpan

    TimeSpan ts = TimeSpan.FromSeconds(150); // 2分钟30秒
    Console.WriteLine(ts); // 00:02:30
    
  5. FromMilliseconds(double value)
    从指定的毫秒数创建 TimeSpan

    TimeSpan ts = TimeSpan.FromMilliseconds(1500); // 1秒500毫秒
    Console.WriteLine(ts); // 00:00:01.5000000
    
  6. FromTicks(long value)
    从指定的刻度数创建 TimeSpan(1 刻度 = 100 纳秒)。

    TimeSpan ts = TimeSpan.FromTicks(10000000); // 1秒(1秒=10,000,000刻度)
    Console.WriteLine(ts); // 00:00:01
    
  7. 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
    
  8. TryParse(string s, out TimeSpan result) / TryParseExact(...)
    尝试解析字符串,解析成功返回 true,失败返回 false(避免抛出异常)。

    bool success = TimeSpan.TryParse("abc", out TimeSpan ts);
    Console.WriteLine(success); // False(解析失败)
    

二、实例方法(操作 TimeSpan 对象)

  1. 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
    
  2. 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
    
  3. Multiply(double factor)
    将时间间隔乘以指定倍数(.NET 5+ 支持)。

    TimeSpan ts = TimeSpan.FromMinutes(10);
    TimeSpan multiplied = ts.Multiply(3); // 10分钟 × 3 = 30分钟
    Console.WriteLine(multiplied); // 00:30:00
    
  4. Divide(double divisor)
    将时间间隔除以指定数值(.NET 5+ 支持)。

    TimeSpan ts = TimeSpan.FromMinutes(30);
    TimeSpan divided = ts.Divide(2); // 30分钟 ÷ 2 = 15分钟
    Console.WriteLine(divided); // 00:15:00
    
  5. Duration()
    返回当前时间间隔的绝对值(无论原间隔为正或负)。

    TimeSpan ts = TimeSpan.FromHours(-2);
    TimeSpan abs = ts.Duration(); // 取绝对值
    Console.WriteLine(abs); // 02:00:00
    
  6. Negate()
    返回当前时间间隔的相反数(正负反转)。

    TimeSpan ts = TimeSpan.FromHours(2);
    TimeSpan negated = ts.Negate(); // 反转符号
    Console.WriteLine(negated); // -02:00:00
    
  7. CompareTo(TimeSpan value)
    比较当前实例与另一个 TimeSpan,返回:

    • 正数:当前实例更大;
    • 0:相等;
    • 负数:当前实例更小。
    TimeSpan ts1 = TimeSpan.FromHours(2);
    TimeSpan ts2 = TimeSpan.FromHours(3);
    int result = ts1.CompareTo(ts2); // 2小时 < 3小时 → 返回 -1
    
  8. Equals(TimeSpan value)
    判断当前实例与指定 TimeSpan 是否相等(值比较)。

    TimeSpan ts1 = TimeSpan.FromHours(2);
    TimeSpan ts2 = TimeSpan.FromMinutes(120);
    bool isEqual = ts1.Equals(ts2); // 2小时 = 120分钟 → True
    
  9. 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 对象(如 FromXxxParse 系列);
  • 实例方法:主要用于时间间隔的计算(如 AddSubtract)、比较(CompareTo)、转换(ToString)等。