DateTime.CompareTo應用於不含假日的日期比較
最近遇到一個專案需要以程式方式計算某一個系統日期加上N天(假設星期六日為非工作日,若系統日期加上N天為星期六、日,則自動順延至下一個工作日)後是否大於使用者輸入的日期,這種日期比較的需求許多AP都會用到,因此把它整理以方便將來reuse,在此運用DateTime.CompareTo方法及DateTime.DateOfWeek屬性來完成,說明如下:
- 下列程式碼用來必較FirstDate是否小於SecondDate加上N天。
1: /// <summary>
2: /// 比較日期
3: /// </summary>
4: /// <param name="FirstDate">第一個日期</param>
5: /// <param name="SecondDate">第二個日期</param>
6: /// <param name="interval">間隔時間</param>
7: /// <returns></returns>
8: private bool CompareDate(DateTime FirstDate, DateTime SecondDate, int interval)
9: {
10: if (FirstDate.CompareTo(GetNextWeekday(SecondDate.AddDays(interval))) < 0)
11: return true;
12: else
13: return false;
14: }
- 上述程式中以GetNextWeekday方法來檢查SecondDate加上N天是否為星期六、日,若是則以遞迴方式找到下一個工作日。
1: /// <summary>
2: /// 取得下一個非假日
3: /// </summary>
4: /// <param name="date">欲比較的日期</param>
5: /// <returns></returns>
6: private DateTime GetNextWeekday(DateTime date)
7: {
8: if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
9: return GetNextWeekday(date.AddDays(1));
10: else
11: return date;
12: }
- 下列程式碼為使用ComareDate方法的範例。
bool bolIsExpired = CompareDate(dtDueDate, dtSignedDate, 2);
TODO:
- 可再加入符合當地國定假日的非工作日,讓這個日期比較的功能更趨完整。
- 日期比較須注意當地語系的問題。
參考資料:
- http://msdn.microsoft.com/zh-tw/library/5ata5aya.aspx?appId=Dev10IDEF1&l=ZH-TW&k=k(SYSTEM.DATETIME.COMPARETO);k(COMPARETO);k(TargetFrameworkMoniker-".NETFRAMEWORK&k=VERSION=V4.0");k(DevLang-CSHARP)&rd=true
- http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-TW&k=k(SYSTEM.DATETIME.DAYOFWEEK);k(DAYOFWEEK);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-CSHARP)&rd=true