C# 计算两个日期之间的月份,然后计算每个月的天数

C# 计算两个日期之间的月份,然后计算每个月的天数,c#,C#,因此,我试图通过从用户那里获取开始和结束日期来创建一个图表。我需要计算两个日期之间的月数,然后计算每个月的天数并得到月份的名称 我得到了两个日期之间的月数,但似乎无法将剩余的转换为代码。我有一门课叫蒙特兰奇 public class MonthRange { public DateTime startDate { get; set; } public DateTime endDate { get; set; } public string monthName { ge

因此,我试图通过从用户那里获取开始和结束日期来创建一个图表。我需要计算两个日期之间的月数,然后计算每个月的天数并得到月份的名称

我得到了两个日期之间的月数,但似乎无法将剩余的转换为代码。我有一门课叫蒙特兰奇

public class MonthRange
{
    public DateTime startDate { get; set; }

    public DateTime endDate { get; set; }

    public string monthName { get; set; }

    public MonthRange() {
    }

    public MonthRange(DateTime startDate, DateTime endDate, string monthName) {
        this.startDate = startDate;
        this.endDate = endDate;
        this.monthName = monthName;
    }
}
我的方法是:

private List<MonthRange> GetRangeOfMonthsBetweenDates(DateTime startDate, DateTime endDate) {

     List<MonthRange> result = new List<MonthRange>();
     int months = (endDate.Year - startDate.Year)*12 + endDate.Month - startDate.month;

foreach(var m in months){
     //get the start and end date of that month with the name and add it to the result list.
}

}
更重要的是,如果开始日期是本月的中段,则应将其保存在结果列表中,同样,如果结束日期是本月的中段,则应将其保存。我有点迷路了,希望能得到任何帮助

编辑:这就是我想要实现的一个例子。我正试图创建一个图表,描绘一个人在给定时间范围内进食的次数

编辑2:所以我最终走了这条路:

 private List<MonthRange> GetRangeOfMonthsBetweenDates(DateTime startDate, DateTime endDate) {

        List<MonthRange> result = new List<MonthRange>();

        DateTime holder = startDate;

        var months = (endDate.Year - startDate.Year) * 12 + endDate.Month - startDate.Month;


        for (int i = 0; i <= months; i++) {
            if (i == 0)
            {
                result.Add(new MonthRange(startDate, CalculateStartOfMonth(endDate), startDate.ToString("MMM")));
            }
            else if (i == months)
            {
                result.Add(new MonthRange(CalculateEndOfMonth(startDate), endDate, endDate.ToString("MMM")));
            }
            else {
                DateTime middleMonth = holder.AddMonths(1);
                result.Add(new MonthRange(CalculateStartOfMonth(middleMonth), CalculateEndOfMonth(middleMonth), middleMonth.ToString("MMM")));
            }
        }

        return result;
    }

    private DateTime CalculateStartOfMonth(DateTime endDate) {
        var startOfMonth = new DateTime(endDate.Year, endDate.Month, 1);
        return startOfMonth;
    }

    private DateTime CalculateEndOfMonth(DateTime startDate)
    {
        var endOfMonth = new DateTime(startDate.Year, startDate.Month, DateTime.DaysInMonth(startDate.Year, startDate.Month));
        return endOfMonth;
    }

我建议你先把所有的时间都转换成天

例如x=361;//总天数

然后你可以把它们分成几个月和几年

months = x/30; // find months 
days = x%30; // find the remainder of the days from the month
years = months/12; // find years

这样计算起来就容易多了。

注意:这不是对问题的回答,而是对不同方法的建议。因为问题是关于绘制一个人在一段时间内的用餐次数,我认为自然的方法是按天计算,而不是按月。从视觉上看,数据可能必须按月表示,但首先按天组织数据,然后按月呈现要容易得多

由于这个问题相当模糊,我对数据做了一些假设。这个类可以用来存储关于一天的信息

class DayEntry
{
    public DateTime Date { get; set; }
    public string MonthName { get; set; }
    public int NumberOfMeals { get; set; }
}
以下函数创建DayEntry对象的列表,这些对象在日期范围内每天都初始化:

List<DayEntry> CreateDayEntries(DateTime dateStart, DateTime dateEnd)
{
    var dateDiff = dateEnd - dateStart;
    var dayCount = (int) Math.Ceiling(dateDiff.TotalDays) + 1;
    var dayRange = new List<DayEntry>(dayCount);

    for (var i = 0; i < dayCount; i++)
    {
        var date = dateStart.AddDays(i);
        var dayEntry = new DayEntry
        {
            Date = date,
            NumberOfMeals = 0, // TODO
            MonthName = date.ToString("MMMM", CultureInfo.CurrentCulture) 
        };

        dayRange.Add(dayEntry);
    }

    return (dayRange);
}
当为给定的日期范围准备好数据时,它可以显示在UI中,按月份分组-由于每个日条目都有自己的日期和它所属的月份的名称,并且在列表中按顺序排列,因此很容易遍历它们并创建UI输出。

根据您的MonthRange结构,尝试以下操作:

private IEnumerable<MonthRange> GetRangeOfMonthsBetweenDates(DateTime startDate, DateTime endDate) {        
    var start = startDate;  
    while(start<endDate) {
        var end = start.AddMonths(1).AddDays(-start.Day);           
        yield return new MonthRange(start, end < endDate ? end : endDate, start.ToString("MMMM"));

        start = end.AddDays(1);
    }
}
应打印:

May: 16/05/2017-31/05/2017
June: 01/06/2017-30/06/2017
July: 01/07/2017-24/07/2017

你想实现什么样的输入和输出?你确定你得到的是正确的吗?当您分别输入例如2016年12月31日23:59和2017年1月1日00:01作为开始日期和结束日期时,是否确实要返回1作为月份计数?你描述的其余部分同样含糊不清。您需要从编写精确、明确的规范开始,详细说明您实际需要的计算。这样,代码就很容易编写了。如果没有它,你可能会盘旋数周试图弄明白这一点。@标记:如果用户输入startDate为2017年5月16日,endDate为2017年7月24日。那么月数应该是3,第一个月的开始日期是16日,第二个月是完整的,第三个月将在24日结束。这有意义吗?@PeterDuniho是的,它将被视为一个不同的月份,因为图表将根据它所属的月份绘制项目。你想做的事情非常奇怪,可能是2017/01/31-2017/03/01怎么样?首先。我的方法是找出给定范围2017/01/31-2017/03/01的日期数,这相当于89天。然后,从那里你除以30,找到月份=2。从那里你可以看到它是0年2个月29天。错了。该日期范围表示3个月内的30天。2017年2月只有28天,选择1月的最后一天和3月的第一天是30天。由于许多原因,您的方法不正确。不符合我的条件-请确保您执行了正确的日期计算。你不能假设月份有30天,根据年份的不同,你不能假设一年有365天。这就是我一直在寻找的。我使用了你的答案,但在如何计算日期、姓名等方面做了一些更改。在帖子中添加了我的答案:@bluebrigade23没问题,如果有用的话,我很高兴。
May: 16/05/2017-31/05/2017
June: 01/06/2017-30/06/2017
July: 01/07/2017-24/07/2017