2011-12-28 14 views
-3

日付を指定します。週末やその他の休日をスキップしてその間に何日を追加することができますか?週末やその他の休日をスキップして日付に日数を追加する方法

List <DateTime> holidays = new List<DateTime>() 
{ 
    new DateTime(2012, 01, 03), 
    new DateTime(2012, 01, 26) 
}; 

dateTimeReview.Value = CalculateFutureDate(dateTimeStart.Value, 7,holidays); 

static DateTime CalculateFutureDate(DateTime fromDate, int numberofWorkDays, ICollection<DateTime> holidays) 
{ 
    var futureDate = fromDate; 

    for (var i = 0; i < numberofWorkDays; i++) 
    { 
      if (futureDate.DayOfWeek == DayOfWeek.Saturday 
      || futureDate.DayOfWeek == DayOfWeek.Sunday 
      || (holidays != null && holidays.Contains(futureDate))) 
      { 
       futureDate = futureDate.AddDays(1); // Increase FutureDate by one because of condition 
       futureDate = futureDate.AddDays(1); // Add a working day 
      } 
    } 
    return futureDate; 
} 
+2

そして質問ですか..?何を試しましたか? – Reniuz

+0

@ user978511:私はそれを試しました。しかし、どうすれば他の休日を除外できますか? –

+0

あなたは何を試してみて、それがあなたのためにはうまくいかないのかを書いてみませんか? –

答えて

4

休暇をスキップするには、まず休暇のリストを作成する必要があります。祝日は各国によって異なりますが、その他の要因もあります。追加日が週末の日ではなく、日の与えられた数が追加されるまで、休日のリストに存在しない場合

次に、あなたがチェックして、ループ内のいずれかでの日1を追加する必要があります。

残念ながら、これを行うには簡単な方法はありません。

0

私は営業時間を確認するために似た何かを構築しました:

public static DateTime AddBusinessHours(DateTime date, long hours) 
    { 
     int i = 0; 

     DateTime tmpDate = date; 

     do 
     { 
      tmpDate = tmpDate.AddHours(1); 
      if (!IsWeekend(tmpDate) && !IsHoliday(tmpDate) && IsOfficeHours(tmpDate)) 
       i++; 
     } 
     while (i < hours); 

     return tmpDate; 
    } 


    public static bool IsWeekend(DateTime date) 
    { 
     return (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday); 
    } 


    public static bool IsHoliday(DateTime date) 
    { 
     //All dates in the holiday calendar are without hours and minutes. 
     //With the normal date object, the Contains does not work. 
     DateTime tmp = new DateTime(date.Year, date.Month, date.Day); 

     HolidayCalendar calendar = HolidayCalendar.Instance; 

     return (calendar.Dates.Contains(tmp)); 
    } 


    public static bool IsOfficeHours(DateTime date) 
    { 
     return (date.Hour >= 8 && date.Hour < 20); //Office Hours are between 8AM and 8PM 
    } 

しかし、前述したように、あなたがあなた自身の休日のカレンダーを実行する必要があります。

3

私は上記のコードを試しても動作しませんでした。返された日付には何とか休日と週末が含まれます。私はまた返された日付が平日のみであることを確認したい。

これは私の変更されたコードです。

基本的には追加される稼働日数を計算し、終了日が祝日/週末に該当する場合、次の日に日付をシフトします。

が、これは開始日が土日/祝日ではないことを前提ににあることにご注意ください。

static DateTime CalculateFutureDate(DateTime fromDate, int numberofWorkDays, 
            ICollection<DateTime> holidays) 
{ 
    var futureDate = fromDate; 
    for (var i = 0; i < numberofWorkDays; i++) 
    { 
      if (futureDate.DayOfWeek == DayOfWeek.Saturday 
      || futureDate.DayOfWeek == DayOfWeek.Sunday 
      || (holidays != null && holidays.Contains(futureDate))) 
      { 
       futureDate = futureDate.AddDays(1); 
       numberofWorkDays++; 
      } 
      else 
      { 
       futureDate = futureDate.AddDays(1); 
      } 
    } 
    while(futureDate.DayOfWeek == DayOfWeek.Saturday 
      || futureDate.DayOfWeek == DayOfWeek.Sunday 
      || (holidays != null && holidays.Contains(futureDate))) 
    { 
      futureDate = futureDate.AddDays(1); 
    } 
    return futureDate; 
} 
+0

こんにちはエレナ、ソリューションを投稿していただきありがとうございます。あなたのコードがなぜ機能するのかを完全に説明するのは本当に良いアイデアですが、他のコードはそうではありません。そのため、家にいる人々は何かを学ぶことができます。あなたはそれを追加できますか? –

+2

要求に応じて編集.. :) – ElenaSofea

0
public static DateTime AddBusinessDays(DateTime pActualDate, int pNumberofWorkDays) 
     { 
      ICollection<DateTime> holidays = GetAllHolidays(); 
      int i = default(int); 
      while (i < pNumberofWorkDays) 
      { 
       pActualDate = pActualDate.AddDays(1); 
       if (pActualDate.DayOfWeek == DayOfWeek.Saturday || pActualDate.DayOfWeek == DayOfWeek.Sunday 
        || (holidays != null && holidays.Contains(pActualDate))) { } 
       else 
       { i++; } 
      } 
      return pActualDate; 
     } 


private static ICollection<DateTime> GetAllHolidays() 
     { 
      ICollection<DateTime> holidays = GetPublicHolidays().Select(s => s.Holidays).ToList(); 
      HashSet<DateTime> finalHolidays = new HashSet<DateTime>(); 

      //if sunday holiday then the following monday will be holiday 
      bool isMonday = GetCalendar().Any(s => s.Type == "KR" && s.IsMonday); 

      foreach (var hol in holidays) 
      { 
       if (hol.DayOfWeek == DayOfWeek.Sunday && isMonday) 
       { 
        //adding monday following day holiday to the list 
        finalHolidays.Add(hol.AddDays(1)); 
       } 
      } 
      //exclude weekends from the holiday list 
      var excludeWeekends = holidays.Where(s => s.DayOfWeek == DayOfWeek.Sunday || s.DayOfWeek == DayOfWeek.Saturday); 
      //adding monday to the existing holiday collection 
      finalHolidays.UnionWith(holidays.Except(excludeWeekends)); 
      return finalHolidays; 
     } 
関連する問題