C# - 計算兩個DateTime的時間差(以年月日量化)

在.Net用DateTime取得時間是一件很容易的事,而.Net也有提供取得兩個DateTime相減的值,但是Return Type竟然為TimeSpan,TimeSpan並不是一個好的表示方式,如果Return
的是相差幾年幾月幾日的話會比較直觀,所以在本篇中,限量寫了一個DateTime相減的擴充方法,Return兩個DateTime相差的年月日值。


在計算兩個DateTime的差值時,較複雜的是要考慮到月份的天數有30天, 31天,2月則有28,29天的可能,這裡還有DateTime有提供DaysInMonth(int year, int month)方法取得某年的某月有幾天。

程式碼:

// 資料型態的擴充方法要寫在static class裡
public static class ExtendMethod 
{
    // 計算兩個日期時間差
    public static Tuple<int, int, int> TimespanToDate(this DateTime self, DateTime target)
    {
        int years, months, days;
     // 因為只需取量,不決定誰大誰小,所以如果self < target時要交換將大的擺前面
        if (self < target)
        {
            DateTime tmp= target;
            target= self;
            self= tmp;
        }

     // 將年轉換成月份以便用來計算
        months= 12 * (self.Year - target.Year) + (self.Month - target.Month);
 
      // 如果天數要相減的量不夠時要向月份借天數補滿該月再來相減
        if (self.Day < target.Day)
        {
            months--;
            days = DateTime.DaysInMonth(target.Year, target.Month) - target.Day + self.Day;
        }
        else
        {
            days= self.Day - target.Day;
        }

     // 天數計算完成後將月份轉成年
        years = months / 12;
        months = months % 12;
  
        return Tuple.Create(years, months, days);
   }
}


主程式:

void Main()
{
    // 計算2014/11/24 ~ 2013/11/25之間差了多少年月日
    var time = new DateTime(2014, 11, 24);
    var result = time.Timespan2Date(new DateTime(2013, 11, 25));
    result.Dump();
}

執行結果:


結果計算出來2013/11/25 ~ 2014/11/24 之間差了11個月又29天。



參考來源:

TechBrij - Convert TimeSpan to year, month, date (Age Calculation) in .NET

留言