计算按月分隔的两个日期之间的天数

计算按月分隔的两个日期之间的天数

问题描述:

我需要计算两个日期(DateTime)之间的天数,但需要加上一个转折点。我想知道这两天的每个月都会有多少天。有两种简单的方法吗?计算按月分隔的两个日期之间的天数

例子:

我有起始日期30/03/2011和结束日期05/04/2011那么结果应该是这样的:

var result = new Dictionary<DateTime, int> 
      { 
       { new DateTime(2011, 3, 1), 2 }, 
       { new DateTime(2011, 4, 1), 5 } 
      }; 
+0

你的意思是{ 3,2},{4,5}?另外,这些日子是否应该连续两个月?如果不是,如果这两个日期跨越几年,该怎么办?字典的关键字是年份还是月份? – 2011-06-17 08:01:48

+0

你是指'{3 => 2,4 => 5}'?字典中不能有两次相同的密钥。 – carlosfigueira 2011-06-17 08:02:44

+0

@Paolo:对,对不起。谢谢。 – 2011-06-17 08:02:45

你可以尝试这样的事:

using System; 
using System.Collections.Generic; 

static class Program { 

    // return dictionary tuple<year,month> -> number of days 
    static Dictionary<Tuple<int, int>, int> GetNumberOfDays(DateTime start, DateTime end) { 
     // assumes end > start 
     Dictionary<Tuple<int, int>, int> ret = new Dictionary<Tuple<int, int>, int>(); 
     DateTime date = end; 
     while (date > start) { 
      if (date.Year == start.Year && date.Month == start.Month) { 
       ret.Add(
        Tuple.Create<int, int>(date.Year, date.Month), 
        (date - start).Days + 1); 
       break; 
      } else { 
       ret.Add(
        Tuple.Create<int, int>(date.Year, date.Month), 
        date.Day); 
       date = new DateTime(date.Year, date.Month, 1).AddDays(-1); 
      } 
     } 
     return ret; 
    } 

    static void Main(params string[] args) { 
     var days = GetNumberOfDays(new DateTime(2011, 3, 1), new DateTime(2011, 4, 1)); 
     foreach (var m in days.Keys) { 
      Console.WriteLine("{0}/{1} : {2} days", m.Item1, m.Item2, days[m]); 
     } 
    } 

} 
+0

差不多,在第一个月,如果我输入30/03/2011作为开始日期,它将返回1,它应该是2,但很容易纠正。谢谢。 – 2011-06-17 14:12:42

+0

@Carles公司:是的,你是对的,修正:) – 2011-06-17 14:25:59

DateTime dt1 = new DateTime(2011, 12, 12); 
DateTime dt2 = new DateTime(2011, 06, 12); 

TimeSpan ts = dt1.Subtract(dt2); 

String s = ts.Days.ToString(); 

MessageBox.Show(s); 

您可以使用类的的:

// ---------------------------------------------------------------------- 
public Dictionary<DateTime,int> CountMonthDays(DateTime start, DateTime end) 
{ 
    Dictionary<DateTime,int> monthDays = new Dictionary<DateTime, int>(); 

    Month startMonth = new Month(start); 
    Month endMonth = new Month(end); 

    if (startMonth.Equals(endMonth)) 
    { 
    monthDays.Add(startMonth.Start, end.Subtract(start).Days); 
    return monthDays; 
    } 

    Month month = startMonth; 
    while (month.Start < endMonth.End) 
    { 
    if (month.Equals(startMonth)) 
    { 
     monthDays.Add(month.Start, month.DaysInMonth - start.Day + 1); 
    } 
    else if (month.Equals(endMonth)) 
    { 
     monthDays.Add(month.Start, end.Day); 
    } 
    else 
    { 
     monthDays.Add(month.Start, month.DaysInMonth); 
    } 
    month = month.GetNextMonth(); 
    } 

    return monthDays; 
} // CountMonthDays 

用法:

// ---------------------------------------------------------------------- 
public void CountDaysByMonthSample() 
{ 
    DateTime start = new DateTime(2011, 3, 30); 
    DateTime end = new DateTime(2011, 4, 5); 

    Dictionary<DateTime, int> monthDays = CountMonthDays(start, end); 
    foreach (KeyValuePair<DateTime, int> monthDay in monthDays) 
    { 
    Console.WriteLine("month {0:d}, days {1}", monthDay.Key, monthDay.Value); 
    } 
    // > month 01.03.2011, days 2 
    // > month 01.04.2011, days 5 
} // CountDaysByMonthSample 

简单的是,快速无:

DateTime StartDate = new DateTime(2011, 3, 30); 
    DateTime EndDate = new DateTime(2011, 4, 5); 

    int[] DaysPerMonth = new int[12]; 

    while (EndDate > StartDate) 
    { 
     DaysPerMonth[StartDate.Month]++; 
     StartDate = StartDate.AddDays(1); 
    } 

这里是我的解决方案。我做了一个快速检查和它似乎工作...让我知道,如果有任何问题:它

public Dictionary<DateTime, int> GetMontsBetween(DateTime startDate, DateTime EndDate) 
    { 
     Dictionary<DateTime, int> rtnValues = new Dictionary<DateTime, int>(); 
     DateTime startMonth = new DateTime(startDate.Year, startDate.Month, 1); 
     DateTime endMonth = new DateTime(EndDate.Year, EndDate.Month, 1); 
     //some checking 
     if (startDate >= EndDate) 
     { 
      rtnValues.Add(startMonth, 0); // Or return null; 
     } 
     else if (startDate.Month == EndDate.Month && startDate.Year == EndDate.Year) 
     { 
      rtnValues.Add(startMonth, EndDate.Day - startDate.Day); 
     } 
     else 
     { 
      //Add first month remaining days 
      rtnValues.Add(startMonth, DateTime.DaysInMonth(startDate.Year, startDate.Month) - startDate.Day); 
      //Add All months days inbetween 
      for (DateTime st = startMonth.AddMonths(1); st < endMonth; st = st.AddMonths(1)) 
      { 
       rtnValues.Add(new DateTime(st.Year, st.Month, 1), DateTime.DaysInMonth(st.Year, st.Month)); 
      } 
      //Add last month days 
      rtnValues.Add(new DateTime(EndDate.Year, EndDate.Month, 1), EndDate.Day); 
     } 
     return rtnValues; 
    } 
+0

几乎,它返回1为第一个月,应该是2.只需将'startDate.Day'更改为'startDate.Day + 1'在这两个地方。 – 2014-09-24 19:09:37

一个非常快速和肮脏的运行使用linqpad:

DateTime start = DateTime.Parse("03/30/2011"); 
DateTime end = new DateTime(2011,04,05,23,59,59); 

var startNextMonthFirstDay = new DateTime(start.Year, start.Month+1, 1); 

var diffForStartMonth = (startNextMonthFirstDay - start); 

var totalDiff = (end-start); 

var diff = Math.Round(totalDiff.TotalDays); 

var diffForEndMonth = diff - diffForStartMonth.Days; 


Dictionary<DateTime, int> result = new Dictionary<DateTime, int>(); 
result.Add(new DateTime(start.Year, start.Month, 1), diffForStartMonth.Days); 
result.Add(new DateTime(end.Year, end.Month, 1), (int)diffForEndMonth); 

//Dictionary<DateTime,int>{{new DateTime(2011,3,1),2},{new DateTime(2011,4,1),5}} 

result.Dump();