bugfix> c# > 投稿

C#windowsフォームベースのアプリケーション。 2つのdateTimeピッカーを使用しました。1つはFrom、もう1つはToです。

datetime picker1で5月30日から休暇を選択し、datetime picker2で6月2日を選択した従業員が4日間の休暇を取る場合。

私の質問は、彼が5月に何日休暇を取ったのか、6月に何日休暇を取ったのかを知るにはどうすればよいですか?

更新 私はこれを知っており、さらに立ち往生

DateTime start = dateTimePicker1.Value.Date; 
DateTime end = dateTimePicker2.Value.Date; 
int a = int.Parse(Convert.ToInt32(end.Subtract(start).Days).ToString());

回答 3 件
  • このコードを試すことができます、

    ここで最後に Dictionary を取得します  (表形式)ここで、キーは月番号、値は月の日数です(質問では、従業員が休暇を取った日数)

    DateTime startDate = new DateTime(2018, 06, 25); //date time picker's date
    DateTime endDate = new DateTime(2018, 07, 05); //date time picker's date
    Dictionary<int, int> daysInMonth = new Dictionary<int, int>();
    while(true)
    {
        DateTime thisMonthEndDate = new DateTime(startDate.Year, startDate.Month, DateTime.DaysInMonth(startDate.Year, startDate.Month));
        if (thisMonthEndDate > endDate)
        {
            thisMonthEndDate = endDate;
            daysInMonth.Add(startDate.Month, (int)(thisMonthEndDate - startDate).TotalDays + 1);
            break;
        }
        daysInMonth.Add(startDate.Month, (int)(thisMonthEndDate - startDate).TotalDays + 1);
        startDate = thisMonthEndDate.AddDays(1);
    }
    
    

    出力印刷は

    foreach(KeyValuePair<int, int> keyVal in daysInMonth)
    {
        Console.WriteLine("For Month:" + keyVal.Key + " leave count:" + keyVal.Value);
    }
    
    

  • タイムスパンで月ごとの日数を取得します。

      for (DateTime date = start; date < end; date = date.AddMonths(1))
       {
           DateTime this_date_start = new DateTime(date.Year, date.Month, 1);
           DateTime this_date_end = this_date_start.AddMonths(1).AddDays(-1);
           TimeSpan duration = this_date_end.Subtract(date);
           Console.WriteLine("duration " + date.Month + " = " + duration.Days  + "days");
       }
    
    

    注意:このループは不完全です:ループの外側でもう一度これを行う必要があります(これは1か月より短い期間もキャッチします)

  • LINQにより、シンプルで読みやすくなります。

    var from = new DateTime(2018, 5, 28);
    var to = new DateTime(2018, 6, 4);
    var result = Enumerable.Range(0, int.MaxValue)
                           .Select(i => from.Date.AddDays(i))
                           .TakeWhile(date => date <= to.Date)
                           .GroupBy(date => date.Month)
                           .Select(range => (Month: range.Key, Days: range.Count()));
    foreach (var month in result)
    {
        Console.WriteLine($"Month: {month.Month}, Seek days: {month.Days}");
    }
    // result:
    // Month: 5, Seek days: 4
    // Month: 6, Seek days: 4
    
    

    特定の月のシーク日数が必要な場合は、辞書にします

    var seekDays = result.ToDictionary(month => month.Month, month => month.SeekDays);
    var seekDaysOfMay = seekDays.GetValueOrDefault(5, 0);
    
    

あなたの答え