0

次のコードを使用して、土曜と日曜をスキップして、特定の時間数の営業日のみを取得しています。実際に私の仕事は何ですか:

プロジェクトとそれを完了する特定の時間があり、プロジェクトが完了する日付を表示したいだけです。

私のコードは次のとおりです。

DateTime date = DateTime.Now;
    Int32 d = 1;
    Int32 result = 260 / 8;
    for (d = 0; d <= result; d++)
    {
        if (date.DayOfWeek.ToString() == "Saturday" || date.DayOfWeek.ToString() == "Sunday")
        {
            d = d - 1;
            date = date.AddDays(1);
        }
        else
        {
            date = date.AddDays(1);
        }
    }
    lbldate.Text = date.ToString();

32 日が 30 日まで正常に動作し、日付は :: 2013 年 11 月 25 日ですが、2013 年 11 月 26 日になります。

どこが間違っているのか教えてください。

4

3 に答える 3

1

もっとエレガントなものがあるかもしれませんが、それは機能し、ループは必要ありません:

public static DateTime GetDateIn(int numWorkingHours)
{
    int numDays = numWorkingHours / 8;
    DateTime date = DateTime.Now;
    // normalize to monday
    if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
        date = date.AddDays(date.DayOfWeek == DayOfWeek.Sunday ? 1 : 2); 
    int weeks = numDays / 5;
    int remainder = numDays % 5;
    date = date.AddDays(weeks * 7 + remainder);  
    // normalize to monday
    if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
        date = date.AddDays(date.DayOfWeek == DayOfWeek.Sunday ? 1 : 2);    
    return date;
}

Demo

于 2013-10-10T14:51:29.890 に答える
1

実用的な解決策は次のとおりです。

DateTime endDate = DateTime.Now;
double remainingAmountOfWorkingDays = Math.Round(260d / 8d);
while (remainingAmountOfWorkingDays > 0)
  {
    endDate = endDate.AddDays(1);

    if (endDate.DayOfWeek == DayOfWeek.Saturday || endDate.DayOfWeek == DayOfWeek.Sunday)
       continue;

    Console.WriteLine(remainingAmountOfWorkingDays +" "+endDate.ToString("dddd dd.MM.yyyy"));
    remainingAmountOfWorkingDays--;
  }           
于 2013-10-10T14:41:48.887 に答える
0

d 変数から減算する代わりに

祝日の土曜または日曜の場合は、次のコードを使用してください

date.Subtract(new TimeSpan(1, 0, 0, 0)); // where 1 is day count you need to subtract 
于 2013-10-10T14:38:07.410 に答える