2012-01-25 20 views
-1

有趣的問題我面臨着,我只是不能拿出一個algorim來計算。通過添加分鐘獲取日期時間,但考慮工作時間和週末

基本上,我想要的是基於DateTime.Now.AddMinutes()計算DateTime,但添加分鐘時應考慮工作時間和週末。

換句話說,如果時間目前是16:50,並且我添加了20分鐘,則該方法應該在08:10(如果明天不是週末的一天)返回一個DateTime。

我已經開始了一些邏輯,但並不完整。有沒有人有一個樣本可以節省我幾個小時的編碼?這是我到目前爲止有:

public DateTime CalculateSLAFromNow(int minutes) 
     { 
      DateTime now = DateTime.Now;     

      TimeSpan slatimeaddedon = CalculateToNextWeekDay(DateTime.Now); 
      TimeSpan finalMinutesAddedon = slatimeaddedon.Add(new TimeSpan(0, minutes, 0)); 
      DateTime SLATime = DateTime.Now.AddMinutes(slatimeaddedon.TotalMinutes); 
      return SLATime; 
     } 


     private TimeSpan CalculateToNextWeekDay(DateTime dt) 
     { 
      //Calculate. 
     } 
+0

有很多變數。我們根據市場小時數(股票市場)使用了「FinanceDateTime」類,但它非常依賴我們的業務模型。對其他人的改裝可能比從頭開始編寫自己的改裝更難。 –

回答

-1

確定。我的朋友寫了以下的作品100%。感謝J爲此。完整的解決方案:

private static DateTime DoCalculation(DateTime startDate, int minutes) 
{ 
    if (startDate.DayOfWeek == DayOfWeek.Sunday) 
    { 
     // if the input date is a sunday, set the actual SLA start date to the following monday morning 7:00AM 
     startDate = startDate.AddHours(24); 
     startDate = new DateTime(startDate.Year, startDate.Month, startDate.Day, 7, 0, 0); 
    } 
    else if (startDate.DayOfWeek == DayOfWeek.Saturday) 
    { 
     // if the input date is a saturday, set the actual SLA start date to the following monday morning 7:00AM 
     startDate = startDate.AddHours(48); 
     startDate = new DateTime(startDate.Year, startDate.Month, startDate.Day, 7, 0, 0); 
    } 

    DateTime resultDate = startDate; 
    for (int i = 0; i < minutes; i++) 
    { 
     resultDate = resultDate.AddMinutes(1); 

     // it is 5PM and time to go home 
     if (resultDate.Hour >= 17) 
     { 
      // if tomorrow is saturday 
      if (resultDate.AddDays(1).DayOfWeek == DayOfWeek.Saturday) 
      { 
       //add 48 hours to get us through the whole weekend 
       resultDate = resultDate.AddHours(48); 
      } 

      // add 14 hours to get us to next morning 
      resultDate = resultDate.AddHours(14); 
     } 
    } 
    return resultDate; 
} 
1
public static DateTime CalculateSLAFromNow(int minutes) 
    { 
     double days = (double)minutes/540; 
     DateTime now = DateTime.Now; 
     DateTime later = now; 
     while (days >= 1) 
     { 
      later = later.AddDays(1); 
      if (later.DayOfWeek == DayOfWeek.Saturday) 
      { 
       later = later.AddDays(2); 
      } 
      days--; 
     } 
     days = days * 540; 
     later = later.AddMinutes(days); 
     if (later.Hour > 17) 
     { 
      later = later.AddHours(15); 
     } 
     if (later.DayOfWeek == DayOfWeek.Saturday) 
     { 
      later = later.AddDays(2); 
     } 
     else if(later.DayOfWeek == DayOfWeek.Sunday) 
     { 
      later = later.AddDays(1); 
     } 
     return later; 
    } 

有現在它佔任何數量的增加分鐘(不是最漂亮的代碼,但它的工作原理)

+0

我會計算開始時間,並用'TimeSpan'替換'minutes'。 – CodesInChaos

+0

謝謝@NominSim。這應該沒問題。我想我必須擺脫添加天數並將實際時間添加到下一個工作日..但是,這是一個很好的開始。謝謝 – Fox

+0

這種方法只適用於'分鐘'是足夠小的值。 –

相關問題