C# 使用 TimeSpan 儲存時間間格

以 WinForms 的 Timer 為例,Timer 的執行時間間格是以毫秒做計算,如果想要設定為 5 秒通常會寫作 5 * 1000 (因為直接寫出來可能要數很多個 0)
    
Timer timer = new Timer();
timer.Interval = 5 * 1000;
timer.Tick += ((sender, args) => Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff")));
timer.Start();
    

因為知道是 Timer 的間隔時間是用毫秒紀錄,所以知道 5 * 1000 的單位是毫秒,不過如果是呼叫一個別人寫好的方法,那可能就會不知道時間的單位了。
例如下面這個方法,就是一定要點進去看才會知道到底是用什麼單位,確定到底是秒?還是毫秒?
    
    public void SetUploadTimeout(int timeout)
    {
        // 猜猜 timeout 的時間單位是什麼
    }
    

註:其實上面例子可以從的變數命名下手,例如改為 timeoutSeconds ,是不是一看就知道了?

TimeSpan 的建構式多載很方便,有以下幾種:
    
        TimeSpan timeSpan;
        timeSpan = new(10 * 1000); // ticks // 10,000 ticks = 1 毫秒
        timeSpan = new(2, 3, 4); // 2 小時 3 分鐘 4 秒
        timeSpan = new(1, 2, 3, 4); // 1 天 2 小時 3 分鐘 4 秒
        timeSpan = new(1, 2, 3, 4, 5); // 1 天 2 小時 3 分鐘 4 秒 5 毫秒
        timeSpan = new(1, 2, 3, 4, 5, 6);// 1 天 2 小時 3 分鐘 4 秒 5 毫秒 6 微秒
    

但是老實說還是不好記,可能每次都要再次檢查,以免寫錯。不過還好有另一個更方便的寫法,這也是筆者最常使用的寫法:
    
        TimeSpan timeSpan;
        
        timeSpan = TimeSpan.FromDays(1); // 天
        timeSpan = TimeSpan.FromHours(1); // 小時
        timeSpan = TimeSpan.FromMinutes(1); // 分鐘
        timeSpan = TimeSpan.FromSeconds(1); // 秒
        timeSpan = TimeSpan.FromMilliseconds(1); // 毫秒
        timeSpan = TimeSpan.FromMicroseconds(1); // 微秒
        timeSpan = TimeSpan.FromTicks(10 * 1000); // ticks // 10,000 ticks = 1 毫秒
    

這樣是不是十分方便?不用去記建構子的順序,而且一目瞭然!不過假設今天遇到多種單位的該如何表示?例如 1 小時零 18 秒,難道要自己換算成同單位?

別急別急,看看下面這樣如何:
    
        TimeSpan timeSpan = TimeSpan.FromHours(1) + TimeSpan.FromSeconds(18);
        Console.WriteLine(timeSpan); // 01:00:18
    

是不是非常方便?

回到剛剛的例子,在 WinForms 中的 Timer 是以毫秒紀錄,那現在使用 TimeSpan 之後該怎麼做呢?
    
TimeSpan timeSpan = TimeSpan.FromHours(1) + TimeSpan.FromSeconds(18);
Console.WriteLine(timeSpan); // 01:00:18
        
Timer timer = new Timer();
timer.Interval = (int)timeSpan.TotalMilliseconds;
timer.Tick += ((sender, args) => Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff")));
timer.Start();
    

留言