2012-01-25 4 views
-1

面白い問題私は直面しており、計算するためのアルゴリズムを思いつくことができません。分を追加してDateTimeを取得しますが、勤務時間と週末を考慮してください

基本的には、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

OK:これは私がこれまで持っているものです。私の友人は100%働く次のように書きました。ありがとうございます。それでは完全な解決策:

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'で置き換えます。 – CodesInChaos

+0

ありがとう@NominSim。これはうまくいくはずです。私はAdd Daysを取り除き、実際の時間を翌営業日に加えなければならないと思う。しかし、これは素晴らしいスタートだ。ありがとう – Fox

+0

このアプローチは、 'minutes'が十分小さい値である場合にのみ機能します。 –

関連する問題