2013-06-12 75 views
1

我如何得到兩個日期之間的工作日數? (有很多工作日的計算,但平日工作時間似乎不太多 - 不是工作/開放時間,只是非週末的工作時間)。獲取兩個日期之間的工作日時間?

這是我的刺傷 - 有沒有更好的方法?

void Main() 
{ 
    // Works 
    DateTime start = new DateTime(2013,6,15,0,0,0); // Saturday 
    DateTime end = new DateTime(2013,6,17,10,0,0); // Monday 

    // Result = 10 (OK) 
    GetBusinessHours(start, end).Dump();   

    // Bugs 
    start = new DateTime(2013,6,14,0,0,0); // Friday 
    end = new DateTime(2013,6,15,0,0,0); // Saturday 

    // Result = 0 (Bug) - should be 24 
    GetBusinessHours(start, end).Dump();   
} 

public double GetBusinessHours(DateTime start, DateTime end) 
{ 
    double result = (end - start).TotalHours; 

    int weekendDays = Enumerable.Range(0, 1 + end.Subtract(start).Days).Select(offset => start.AddDays(offset)).Count(d => d.DayOfWeek == DayOfWeek.Sunday || d.DayOfWeek == DayOfWeek.Saturday);  

    double weekendDeltaHours = 0; 
    if (start.DayOfWeek == DayOfWeek.Saturday || 
     start.DayOfWeek == DayOfWeek.Sunday) 
    {   
     weekendDays--; 
     weekendDeltaHours = start.Date.AddDays(1).Subtract(start).TotalHours; 
    } 
    else if (end.DayOfWeek == DayOfWeek.Saturday || 
      end.DayOfWeek == DayOfWeek.Sunday) 
    { 
     weekendDeltaHours = (end - end.Date).TotalHours; 
    } 

    result = result - (weekendDays * 24) - weekendDeltaHours;   
    return result; 
} 

(道具Ani爲Enumerable.Range招)。

回答

2

這不是說這將是最有效的方法,它可以滿足您的要求。

var end = DateTime.Now; 
var start = end.AddDays(-100); 
var weekend = new[] { DayOfWeek.Saturday, DayOfWeek.Sunday }; 

var count = Enumerable.Range(0, Convert.ToInt32(end.Subtract(start).TotalHours)) 
    .Count(offset => !weekend.Contains(start.AddHours(offset).DayOfWeek)); 

這可能是值得把一個檢查的小時數是不是太大的int。但是,這意味着日期範圍> 245,000年!

+0

Splendid謝謝。只需要將第二個Range參數強制轉換爲int。 – PeterX

+0

嗨,彼得,我注意到發佈後,請參閱更新。乾杯 – Oliver

相關問題