最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# TimeSpan計(jì)算時間差的操作完整指南

 更新時間:2025年12月09日 08:20:29   作者:唐青楓  
TimeSpan 是 .NET 中用于表示時間間隔或持續(xù)時間的重要結(jié)構(gòu)體,它提供了豐富的方法和屬性來處理時間跨度,下面我們就來看看C# TimeSpan計(jì)算時間差的完整操作吧

簡介

TimeSpan.NET 中用于表示時間間隔或持續(xù)時間的重要結(jié)構(gòu)體。它提供了豐富的方法和屬性來處理時間跨度,從幾毫秒到幾百萬天都可以精確表示。

概念與特性

TimeSpan 表示一個時間間隔(時間段),而不是具體的時間點(diǎn)。

特性說明
命名空間System
結(jié)構(gòu)類型struct(值類型)
表示范圍約 ±10,675,199 天(≈29,000 年)
精度1 Tick = 100 納秒
單位表示可用天、小時、分鐘、秒、毫秒、Ticks

DateTime 區(qū)別:

  • DateTime 表示一個具體的時間點(diǎn)(例如:2025-09-18 08:00)。
  • TimeSpan 表示一個時間間隔(例如:2 小時 30 分鐘)。

創(chuàng)建 TimeSpan

構(gòu)造函數(shù)

// 構(gòu)造函數(shù):TimeSpan(days, hours, minutes, seconds)
var span1 = new TimeSpan(1, 2, 30, 0); // 1天2小時30分0秒

// 構(gòu)造函數(shù):TimeSpan(hours, minutes, seconds)
var span2 = new TimeSpan(2, 30, 0);    // 2小時30分

靜態(tài)工廠方法

推薦使用靜態(tài)方法,可讀性更高:

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總天數(shù)(整數(shù)部分)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總天數(shù)(含小數(shù))ts.TotalDays
TotalHours總小時數(shù)(含小數(shù))ts.TotalHours
TotalMinutes總分鐘數(shù)(含小數(shù))ts.TotalMinutes
TotalSeconds總秒數(shù)(含小數(shù))ts.TotalSeconds
TotalMilliseconds總毫秒數(shù)ts.TotalMilliseconds

區(qū)別

  • Days、Hours 等返回整數(shù)部分(對應(yīng)分量)。
  • TotalDays、TotalHours 等返回完整總量。

示例:

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

運(yùn)算操作

加減

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() 手動計(jì)算。 (.NET 7 / C# 11 起支持 * / 運(yùn)算符)

比較

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

取負(fù)值

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

與 DateTime 配合

TimeSpan 常用于計(jì)算兩個時間點(diǎn)的差值:

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

TimeSpan elapsed = end - start;
Console.WriteLine($"執(zhí)行耗時: {elapsed.TotalMilliseconds} ms");

也可以用來加減時間:

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

格式化輸出

默認(rèn)格式

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

標(biāo)準(zhǔn)格式

Console.WriteLine(ts.ToString("c"));     // 同上 (常數(shù)格式)
Console.WriteLine(ts.ToString("g"));     // 1:2:30:45.5 (常規(guī)短格式)
Console.WriteLine(ts.ToString("G"));     // 1:02:30:45.5000000 (常規(guī)長格式)

自定義格式

ToString 支持標(biāo)準(zhǔn)和自定義格式:

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

需要轉(zhuǎn)義 : 和 .

常用靜態(tài)字段

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

典型使用場景

定時任務(wù)/超時控制

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

統(tǒng)計(jì)程序耗時

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

實(shí)際應(yīng)用示例

using System;

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

        // 模擬任務(wù)
        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 擴(kuò)展方

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} 毫秒";
    }
}

// 使用擴(kuò)展方法
TimeSpan ts = TimeSpan.FromHours(2.5);
Console.WriteLine(ts.ToHumanReadableString()); // 輸出: 2 小時 30 分鐘

注意事項(xiàng)和最佳實(shí)踐

不可變性:TimeSpan 是值類型且不可變,所有操作都返回新的 TimeSpan 實(shí)例

精度考慮:TimeSpan 使用 ticks(100 納秒)作為內(nèi)部存儲,提供高精度但需要注意浮點(diǎn)運(yùn)算的精度問題

文化敏感性:解析和格式化 TimeSpan 時,注意當(dāng)前線程的文化設(shè)置

性能考慮:對于高性能場景,考慮使用 Stopwatch 而不是 DateTime 減法來計(jì)算時間間隔

到此這篇關(guān)于C# TimeSpan計(jì)算時間差的操作完整指南的文章就介紹到這了,更多相關(guān)C# TimeSpan時間差內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#文件操作、讀取文件、Debug/Trace類用法

    C#文件操作、讀取文件、Debug/Trace類用法

    這篇文章介紹了C#文件操作、讀取文件、Debug/Trace類的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 解決Unity無限滾動復(fù)用列表的問題

    解決Unity無限滾動復(fù)用列表的問題

    這篇文章主要介紹了Unity無限滾動復(fù)用列表,無限滾動復(fù)用ScrollView就是解決這種問題,還可以用來做朋友圈,聊天等,需要的朋友可以參考下
    2022-04-04
  • 基于WPF實(shí)現(xiàn)簡單的下拉篩選控件

    基于WPF實(shí)現(xiàn)簡單的下拉篩選控件

    這篇文章主要為大家詳細(xì)介紹了如何基于WPF實(shí)現(xiàn)簡單的下拉篩選控件,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-04-04
  • C#圖像灰度級拉伸的方法

    C#圖像灰度級拉伸的方法

    這篇文章主要介紹了C#圖像灰度級拉伸的方法,涉及C#灰度操作的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#實(shí)時監(jiān)控文件系統(tǒng)變化的實(shí)戰(zhàn)指南

    C#實(shí)時監(jiān)控文件系統(tǒng)變化的實(shí)戰(zhàn)指南

    在現(xiàn)代開發(fā)中,實(shí)時監(jiān)控文件系統(tǒng)變化是許多應(yīng)用場景的核心需求,例如日志分析、文件同步、配置熱更新等,在C#中,FileSystemWatcher是實(shí)現(xiàn)類似功能的“臥底”工具,本文將揭秘如何通過FileSystemWatcher實(shí)現(xiàn)高效、隱蔽、穩(wěn)定的文件系統(tǒng)監(jiān)聽,需要的朋友可以參考下
    2025-07-07
  • C#備忘錄人生存檔的設(shè)計(jì)模式實(shí)例

    C#備忘錄人生存檔的設(shè)計(jì)模式實(shí)例

    這篇文章主要為大家介紹了C#設(shè)計(jì)模式中備忘錄模式的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Unity3D運(yùn)行報(bào)DllNotFoundException錯誤的解決方案

    Unity3D運(yùn)行報(bào)DllNotFoundException錯誤的解決方案

    這篇文章主要介紹了Unity3D運(yùn)行報(bào)DllNotFoundException錯誤的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#使用Post調(diào)用接口并傳遞json參數(shù)

    C#使用Post調(diào)用接口并傳遞json參數(shù)

    這篇文章主要介紹了C#使用Post調(diào)用接口并傳遞json參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。
    2022-06-06
  • C# 設(shè)計(jì)模式系列教程-代理模式

    C# 設(shè)計(jì)模式系列教程-代理模式

    代理模式對客戶端來說,隱藏了真實(shí)對象的細(xì)節(jié)及復(fù)雜性,實(shí)現(xiàn)了客戶端(調(diào)用者)與真實(shí)對象的松耦合,提高了運(yùn)行速度。
    2016-06-06
  • C# 中const,readonly,static的使用小結(jié)

    C# 中const,readonly,static的使用小結(jié)

    這篇文章主要介紹了C# 中使用const,readonly,static的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01

最新評論

长岛县| 鸡泽县| 年辖:市辖区| 全椒县| 阿克| 永春县| 五华县| 甘泉县| 平果县| 贵定县| 吐鲁番市| 潮安县| 木里| 武威市| 安宁市| 宁陕县| 广西| 萝北县| 铜陵市| 青阳县| 水富县| 横山县| 马山县| 苍山县| 中阳县| 九龙城区| 尚义县| 县级市| 吉安县| 滦南县| 日喀则市| 堆龙德庆县| 西峡县| 阳曲县| 麻栗坡县| 花垣县| 金山区| 拉孜县| 盐城市| 彭山县| 瓦房店市|