System.DateTime運算小範例(迄今時間計算:年月天)

今天遇到一個以前沒有處理過的需求,就是要計算兩個日期的差距,但必須以過了幾年、幾月、幾天來表示,這事情初步想起來很簡單,用System.TimeSpan就解決了,但仔細一想其實蠻複雜的。

這類型需求的應用,其實並不算罕見,例如我們想要顯示:「你現在已經活了OO年OO月OO天,請把握生命!」、「這篇貼文迄今已經過了OO年OO月OO天」之類的,對於一些強迫症的老闆來說,還真的是會有這樣的要求。例如:

Posted 0 years, 0 months, 0 days, 0 hours, 0 minutes and 0 seconds ago

System.TimeSpan支援方法不足

可惜的是,我們的好朋友System.TimeSpan的Totla系列方法,並沒有提供上面的需求,他只有下列的方法:

啊,我說那個TotalMonths或是TotalYears呢?!

不要自幹,請愛用.NET Framework啊!

在看不到好朋友System.TimeSpan提供相關方法後,一度開始想要自幹寫一些判斷閏年天數的方法,但發現不對,我可以使用System.DateTime啊!可以站在巨人的肩膀上何必自己寫演算法,況且既複雜又有可能出錯~以下就是程式碼嘍!

public static void Main()
{
  System.DateTime dArticle = System.Convert.ToDateTime("2000-02-29");
  System.DateTime dNow = System.DateTime.Now;
  System.TimeSpan oTS = new System.TimeSpan(dNow.Ticks - dArticle.Ticks);
  //減去System.DateTime.MinValue: 1Years 1Months 1Days
  System.DateTime oDT = System.DateTime.MinValue.AddTicks(oTS.Ticks).AddYears(-1).AddMonths(-1).AddDays(-1);
  Console.WriteLine($"Article Date: {dArticle.ToString("yyyy-MM-dd")} to {dNow.ToString("yyyy-MM-dd")}");
  Console.WriteLine($"Posted {oDT.Year} years, {oDT.Month} months, {oDT.Day} days, {oDT.Hour} hours, {oDT.Minute} minutes and {oDT.Second} seconds ago");
}

輸出結果:

Article Date: 2000-02-29 to 2018-10-03
Posted 18 years, 7 months, 5 days, 10 hours, 23 minutes and 30 seconds ago

用Windows小算盤驗證結果,果然沒錯:

相關連結:

System.DateTime運算小範例(時間差距、同日判斷) System.TimeSpan System.DateTime TimeDiff TimeDuration