在.Net用DateTime取得時間是一件很容易的事,而.Net也有提供取得兩個DateTime相減的值,但是Return Type竟然為TimeSpan,TimeSpan並不是一個好的表示方式,如果Return
的是相差幾年幾月幾日的話會比較直觀,所以在本篇中,限量寫了一個DateTime相減的擴充方法,Return兩個DateTime相差的年月日值。
在計算兩個DateTime的差值時,較複雜的是要考慮到月份的天數有30天, 31天,2月則有28,29天的可能,這裡還有DateTime有提供DaysInMonth(int year, int month)方法取得某年的某月有幾天。
結果計算出來2013/11/25 ~ 2014/11/24 之間差了11個月又29天。
參考來源:
TechBrij - Convert TimeSpan to year, month, date (Age Calculation) in .NET
的是相差幾年幾月幾日的話會比較直觀,所以在本篇中,限量寫了一個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
留言
張貼留言