C# 计算以月份分隔的两个日期之间的天数

C# 计算以月份分隔的两个日期之间的天数,c#,.net,datetime,C#,.net,Datetime,我需要计算两个日期之间的天数(DateTime),但要有一个转折点。我想知道这两天跨越的每个月有多少天。有没有一个简单的方法 例如: 我有2011年3月30日的开始日期和2011年4月5日的结束日期,那么结果应该是: var result = new Dictionary<DateTime, int> { { new DateTime(2011, 3, 1), 2 }, { new DateTi

我需要计算两个日期之间的天数(
DateTime
),但要有一个转折点。我想知道这两天跨越的每个月有多少天。有没有一个简单的方法

例如:

我有2011年3月30日的开始日期和2011年4月5日的结束日期,那么结果应该是:

var result = new Dictionary<DateTime, int>
             {
                { new DateTime(2011, 3, 1), 2 },
                { new DateTime(2011, 4, 1), 5 }
             };
var result=新字典
{
{新日期时间(2011,3,1),2},
{新日期时间(2011年4月1日),5}
};

您可以尝试以下方法:

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]);
        }
    }

}
使用系统;
使用System.Collections.Generic;
静态类程序{
//返回字典元组->天数
静态字典GetNumberOfDays(日期时间开始,日期时间结束){
//假设结束>开始
字典ret=新字典();
日期时间日期=结束;
while(日期>开始){
如果(date.Year==start.Year&&date.Month==start.Month){
重新添加(
Tuple.Create(date.Year,date.Month),
(日期-开始)。天数+1);
打破
}否则{
重新添加(
Tuple.Create(date.Year,date.Month),
日期(天),;
日期=新的日期时间(日期.年,日期.月,1).AddDays(-1);
}
}
返回ret;
}
静态void Main(参数字符串[]args){
var days=GetNumberOfDays(新日期时间(2011,3,1),新日期时间(2011,4,1));
foreach(var m,以天为单位。键){
WriteLine(“{0}/{1}:{2}天”,m.Item1,m.Item2,天[m]);
}
}
}

您可以使用以下类别的月份:

//----------------------------------------------------------------------
公共字典CountMonthDays(日期时间开始,日期时间结束)
{
Dictionary monthDays=新字典();
月份开始月份=新月份(开始);
月末=新月份(月末);
如果(开始月等于结束月))
{
monthDays.Add(开始月开始,结束月减去开始日);
返回月日;
}
月=开始月;
while(月开始<月结束)
{
如果(月等于(起始月))
{
monthDays.Add(month.Start,month.DaysInMonth-Start.Day+1);
}
else if(月等于月底))
{
monthDays.Add(月、开始、结束、天);
}
其他的
{
monthDays.Add(month.Start,month.DaysInMonth);
}
month=month.GetNextMonth();
}
返回月日;
}//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
//----------------------------------------------------------------------
public void CountDaysByMonthSample()
{
日期时间开始=新的日期时间(2011,3,30);
DateTime end=新的DateTime(2011,4,5);
字典monthDays=CountMonthDays(开始、结束);
foreach(KeyValuePair monthDay in monthDays)
{
WriteLine(“月{0:d},天{1}”,monthDay.Key,monthDay.Value);
}
//>2011年3月1日第2天
//>2011年4月1日第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;
    }
公共字典GetMontsBetween(日期时间开始日期、日期时间结束日期) { 字典RTN值=新字典(); DateTime startMonth=新的日期时间(startDate.Year,startDate.Month,1); DateTime endMonth=新的日期时间(EndDate.Year,EndDate.Month,1); //一些检查 如果(开始日期>=结束日期) { 添加(startMonth,0);//或返回null; } else if(startDate.Month==EndDate.Month&&startDate.Year==EndDate.Year) { rtnValues.Add(startMonth,EndDate.Day-startDate.Day); } 其他的 { //添加第一个月剩余天数 rtnValues.Add(startMonth,DateTime.DaysInMonth(startDate.Year,startDate.Month)-startDate.Day); //添加中间的所有月份和天数 对于(日期时间st=startMonth.AddMonths(1);st使用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();
DateTime start=DateTime.Parse(“2011年3月30日”);
DateTime end=新的日期时间(2011,04,05,23,59,59);
var startNextMonthFirstDay=新日期时间(start.Year,start.Month+1,1);
var diffForStartMonth=(startNextMonthFirstDay-开始);
var totalDiff=(结束-开始);
var diff=数学轮(totalDiff.TotalDays);
var diffForEndMonth=diff-diffforstartmount.Days;
字典结果=新字典();
结果.Add(新的日期时间(start.Year,start.Month,1),diffForStartMonth.Days);
结果.Add(新的日期时间(年底、月底、1),(int)diffForEndMonth);
//字典{newdatetime(2011,3,1),2},{newdatetime(2011,4,1),5}}
result.Dump();

关于如何使用内置的DateTime.DaysInMonth方法准确获得两个日期之间的月和日总数的小示例,该方法给出了每个月的天数,因此我们可以获得100%的准确率

DateTime date1 = DateTime.Now.AddDays(60);
DateTime date2 = DateTime.Now;
TimeSpan ts = date1 - date2;
int totalDays = int.Parse(ts.TotalDays.ToString("0"));
int totalMonths = Math.Abs((date1.Month - date2.Month) + 12 * (date1.Year - date2.Year));
int months = 0;
int days = 0;
int totalDaysInMonths = 0;
for (int i = totalMonths; i > 0; i--)
{
    int month = date2.Month + i;
    int year = date1.Year;
    if (month > 12)
    {
        year++;
        int newMonth = month - 12;
        month = newMonth;
    }

    totalDaysInMonths = totalDaysInMonths + DateTime.DaysInMonth(year, month);
}

if (totalDays > totalDaysInMonths)
{
    months = totalMonths - 1;
    days = totalDays - totalDaysInMonths;
}

else if (totalDays < totalDaysInMonths)
{
    months = totalMonths - 1;
    int tempTotalDaysInMonths = 0;
    for (int i = months; i > 0; i--)
    {
        int month = date2.Month + i;
        int year = date1.Year;
        if (month > 12)
        {
            year++;
            int newMonth = month - 12;
            month = newMonth;
        }

        tempTotalDaysInMonths = tempTotalDaysInMonths + DateTime.DaysInMonth(year, month);
    }


    days = totalDays - tempTotalDaysInMonths;
}

else
{
    months = totalMonths;
}

return string.Format("{0} months and {1} days", months, days);
DateTime date1=DateTime.Now.AddDays(60);
DateTime date2=DateTime.Now;
TimeSpan ts=日期1-日期2;
int totalDays=int.Parse(ts.totalDays.ToString(“0”);
int totalMonths=Math.Abs((date1.Month-date2.Month)+12*(date1.Year-date2.Year));
整月=0;
整数天=0;
int totalDaysInMonths=0;
对于(int i=totalMonths;i>0;i--)
{
int MOUNT=date2.月+i;
int year=日期1.年;
如果(月份>12)
{
年份++;
int newMonth=第12个月;
月份=新月份;
}
totalDaysInMonths=totalDaysInMonths+DateTime.DaysInMonth(年,m
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();
DateTime date1 = DateTime.Now.AddDays(60);
DateTime date2 = DateTime.Now;
TimeSpan ts = date1 - date2;
int totalDays = int.Parse(ts.TotalDays.ToString("0"));
int totalMonths = Math.Abs((date1.Month - date2.Month) + 12 * (date1.Year - date2.Year));
int months = 0;
int days = 0;
int totalDaysInMonths = 0;
for (int i = totalMonths; i > 0; i--)
{
    int month = date2.Month + i;
    int year = date1.Year;
    if (month > 12)
    {
        year++;
        int newMonth = month - 12;
        month = newMonth;
    }

    totalDaysInMonths = totalDaysInMonths + DateTime.DaysInMonth(year, month);
}

if (totalDays > totalDaysInMonths)
{
    months = totalMonths - 1;
    days = totalDays - totalDaysInMonths;
}

else if (totalDays < totalDaysInMonths)
{
    months = totalMonths - 1;
    int tempTotalDaysInMonths = 0;
    for (int i = months; i > 0; i--)
    {
        int month = date2.Month + i;
        int year = date1.Year;
        if (month > 12)
        {
            year++;
            int newMonth = month - 12;
            month = newMonth;
        }

        tempTotalDaysInMonths = tempTotalDaysInMonths + DateTime.DaysInMonth(year, month);
    }


    days = totalDays - tempTotalDaysInMonths;
}

else
{
    months = totalMonths;
}

return string.Format("{0} months and {1} days", months, days);