C# TimeSpan计算时间差的操作完整指南

 更新时间:2025年12月09日 08:20:29   作者:唐青枫  
TimeSpan 是 .NET 中用于表示时间间隔或持续时间的重要结构体,它提供了丰富的方法和属性来处理时间跨度,下面我们就来看看C# TimeSpan计算时间差的完整操作吧

简介

TimeSpan.NET 中用于表示时间间隔或持续时间的重要结构体。它提供了丰富的方法和属性来处理时间跨度,从几毫秒到几百万天都可以精确表示。

概念与特性

TimeSpan 表示一个时间间隔(时间段),而不是具体的时间点。

特性说明
命名空间System
结构类型struct(值类型)
表示范围约 ±10,675,199 天(≈29,000 年)
精度1 Tick = 100 纳秒
单位表示可用天、小时、分钟、秒、毫秒、Ticks

DateTime 区别:

  • DateTime 表示一个具体的时间点(例如:2025-09-18 08:00)。
  • TimeSpan 表示一个时间间隔(例如:2 小时 30 分钟)。

创建 TimeSpan

构造函数

// 构造函数:TimeSpan(days, hours, minutes, seconds)
var span1 = new TimeSpan(1, 2, 30, 0); // 1天2小时30分0秒

// 构造函数:TimeSpan(hours, minutes, seconds)
var span2 = new TimeSpan(2, 30, 0);    // 2小时30分

静态工厂方法

推荐使用静态方法,可读性更高:

TimeSpan ts1 = TimeSpan.FromDays(1.5);       // 1.5天
TimeSpan ts2 = TimeSpan.FromHours(2.5);      // 2.5小时
TimeSpan ts3 = TimeSpan.FromMinutes(90);     // 90分钟
TimeSpan ts4 = TimeSpan.FromSeconds(45);     // 45秒
TimeSpan ts5 = TimeSpan.FromMilliseconds(500); // 500毫秒
TimeSpan ts6 = TimeSpan.FromTicks(5000);     // 5000 Ticks

解析字符串

TimeSpan ts = TimeSpan.Parse("1.02:30:00");  
// 格式:d.hh:mm:ss -> 1天2小时30分

或安全解析:

if (TimeSpan.TryParse("02:15", out var result))
    Console.WriteLine(result); // 02:15:00

常用属性

属性说明示例
Days总天数(整数部分)ts.Days
Hours小时(0–23)ts.Hours
Minutes分钟(0–59)ts.Minutes
Seconds秒(0–59)ts.Seconds
Milliseconds毫秒(0–999)ts.Milliseconds
Ticks以 Tick(100ns)为单位ts.Ticks
TotalDays总天数(含小数)ts.TotalDays
TotalHours总小时数(含小数)ts.TotalHours
TotalMinutes总分钟数(含小数)ts.TotalMinutes
TotalSeconds总秒数(含小数)ts.TotalSeconds
TotalMilliseconds总毫秒数ts.TotalMilliseconds

区别

  • DaysHours 等返回整数部分(对应分量)。
  • TotalDaysTotalHours 等返回完整总量。

示例:

var ts = new TimeSpan(1, 2, 30, 0);
Console.WriteLine(ts.Days);        // 1
Console.WriteLine(ts.TotalHours);  // 26.5

运算操作

加减

var t1 = TimeSpan.FromHours(3);
var t2 = TimeSpan.FromMinutes(30);

TimeSpan sum = t1 + t2;  // 3:30:00
TimeSpan diff = t1 - t2; // 2:30:00

乘除

TimeSpan doubleTime = TimeSpan.FromMinutes(45) * 2; // 1:30:00
TimeSpan halfTime   = TimeSpan.FromHours(4) / 2;    // 2:00:00

C# 11 之前不支持直接乘除,需要用 TimeSpan.FromTicks() 手动计算。 (.NET 7 / C# 11 起支持 * / 运算符)

比较

TimeSpan ts1 = TimeSpan.FromHours(2);
TimeSpan ts2 = TimeSpan.FromMinutes(120); // 也是2小时

// 比较
bool isEqual = ts1 == ts2;                // true
bool isNotEqual = ts1 != ts2;             // false
bool isGreater = ts1 > TimeSpan.FromHours(1); // true
bool isLess = ts1 < TimeSpan.FromHours(3);    // true

// 比较方法
int compareResult = ts1.CompareTo(ts2);   // 0 (相等)
bool equals = ts1.Equals(ts2);            // true

取绝对值

var negative = TimeSpan.FromHours(-5);
var positive = negative.Duration(); // 05:00:00

取负值

var neg = -TimeSpan.FromMinutes(30); // -00:30:00

与 DateTime 配合

TimeSpan 常用于计算两个时间点的差值:

DateTime start = DateTime.Now;
// 模拟一些操作
System.Threading.Thread.Sleep(1500);
DateTime end = DateTime.Now;

TimeSpan elapsed = end - start;
Console.WriteLine($"执行耗时: {elapsed.TotalMilliseconds} ms");

也可以用来加减时间:

DateTime tomorrow = DateTime.Now + TimeSpan.FromDays(1);

格式化输出

默认格式

Console.WriteLine(ts.ToString()); // "1.02:30:00" (d.hh:mm:ss)

标准格式

Console.WriteLine(ts.ToString("c"));     // 同上 (常数格式)
Console.WriteLine(ts.ToString("g"));     // 1:2:30:45.5 (常规短格式)
Console.WriteLine(ts.ToString("G"));     // 1:02:30:45.5000000 (常规长格式)

自定义格式

ToString 支持标准和自定义格式:

var ts = new TimeSpan(1, 2, 30, 45, 500);
Console.WriteLine(ts.ToString(@"hh\:mm\:ss"));        // 02:30:45
Console.WriteLine(ts.ToString(@"d\.hh\:mm\:ss\.fff")); // 1.02:30:45.500

需要转义 : 和 .

常用静态字段

字段说明
TimeSpan.Zero表示 0
TimeSpan.MaxValue最大可表示值
TimeSpan.MinValue最小可表示值

典型使用场景

定时任务/超时控制

var timeout = TimeSpan.FromSeconds(30);
var cts = new CancellationTokenSource(timeout);

统计程序耗时

var watch = System.Diagnostics.Stopwatch.StartNew();
// do work
watch.Stop();
Console.WriteLine(watch.Elapsed); // TimeSpan

实际应用示例

using System;

class Program
{
    static void Main()
    {
        DateTime start = DateTime.Now;

        // 模拟任务
        System.Threading.Thread.Sleep(1200);

        DateTime end = DateTime.Now;
        TimeSpan span = end - start;

        Console.WriteLine($"耗时: {span.TotalMilliseconds} 毫秒");
        Console.WriteLine($"格式化: {span.ToString(@"hh\:mm\:ss\.fff")}");
        Console.WriteLine($"天: {span.Days}, 小时: {span.Hours}, 总小时: {span.TotalHours:F2}");
    }
}

输出示例:

耗时: 1203.45 毫秒
格式化: 00:00:01.203
天: 0, 小时: 0, 总小时: 0.00

高级用法

自定义 TimeSpan 扩展方

public static class TimeSpanExtensions
{
    public static string ToHumanReadableString(this TimeSpan timeSpan)
    {
        if (timeSpan.TotalDays >= 1)
            return $"{(int)timeSpan.TotalDays} 天 {timeSpan.Hours} 小时";
        
        if (timeSpan.TotalHours >= 1)
            return $"{(int)timeSpan.TotalHours} 小时 {timeSpan.Minutes} 分钟";
        
        if (timeSpan.TotalMinutes >= 1)
            return $"{(int)timeSpan.TotalMinutes} 分钟 {timeSpan.Seconds} 秒";
        
        if (timeSpan.TotalSeconds >= 1)
            return $"{(int)timeSpan.TotalSeconds} 秒";
        
        return $"{timeSpan.Milliseconds} 毫秒";
    }
}

// 使用扩展方法
TimeSpan ts = TimeSpan.FromHours(2.5);
Console.WriteLine(ts.ToHumanReadableString()); // 输出: 2 小时 30 分钟

注意事项和最佳实践

不可变性:TimeSpan 是值类型且不可变,所有操作都返回新的 TimeSpan 实例

精度考虑:TimeSpan 使用 ticks(100 纳秒)作为内部存储,提供高精度但需要注意浮点运算的精度问题

文化敏感性:解析和格式化 TimeSpan 时,注意当前线程的文化设置

性能考虑:对于高性能场景,考虑使用 Stopwatch 而不是 DateTime 减法来计算时间间隔

到此这篇关于C# TimeSpan计算时间差的操作完整指南的文章就介绍到这了,更多相关C# TimeSpan时间差内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Response.Redirect 正在中止线程解决方案

    Response.Redirect 正在中止线程解决方案

    这两天在开发调试过程中,老是会出现在一个 "正在中止线程“(ThreadAbortException)的例外信息,很是疑惑,于是网上收集整理了一下,现在晒出来和大家分享,希望对你们有帮助
    2012-11-11
  • C#难点逐个击破(9):类型转换

    C#难点逐个击破(9):类型转换

    类型之间的转换可以分为隐式转换与显式转换,如int类型可直接转换为long类型。
    2010-02-02
  • c#中?的六种用途

    c#中?的六种用途

    ? 是一个多用途的符号,具有多种不同的用途,本文主要介绍了c#中?的六种用途,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • Unity3D实现物体闪烁效果

    Unity3D实现物体闪烁效果

    这篇文章主要为大家详细介绍了Unity3D实现物体闪烁效果,类似霓虹灯、跑马灯、LED灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 基于WPF实现自定义弹窗输入功能

    基于WPF实现自定义弹窗输入功能

    这篇文章主要为大家详细介绍了如何基于WPF实现自定义弹窗输入功能,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2025-07-07
  • C#缓存之SqlCacheDependency用法实例总结

    C#缓存之SqlCacheDependency用法实例总结

    这篇文章主要介绍了C#缓存之SqlCacheDependency用法,在C#程序设计中有一定的实用价值,需要的朋友可以参考下
    2014-08-08
  • c#实现sqlserver事务处理示例

    c#实现sqlserver事务处理示例

    这篇文章主要介绍了c#实现sqlserver事务处理的示例,大家参考使用吧
    2014-01-01
  • C#使用RestClient调用Web API

    C#使用RestClient调用Web API

    这篇文章介绍了C#使用RestClient调用Web API的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#编程报错System.InvalidOperationException问题及解决

    C#编程报错System.InvalidOperationException问题及解决

    这篇文章主要介绍了C#编程报错System.InvalidOperationException问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • C#应用BindingSource实现数据同步的方法

    C#应用BindingSource实现数据同步的方法

    这篇文章主要介绍了C#应用BindingSource实现数据同步的方法,需要的朋友可以参考下
    2014-08-08

最新评论