Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取两个日期(即开始日期和结束日期)之间的月份和剩余天数_C#_Linq - Fatal编程技术网

C# 如何获取两个日期(即开始日期和结束日期)之间的月份和剩余天数

C# 如何获取两个日期(即开始日期和结束日期)之间的月份和剩余天数,c#,linq,C#,Linq,我正试图破解一个逻辑,但到现在为止运气都不好。需要您的支持来解决问题。我需要计算开始日期和结束日期之间一个月内发生的天数 以下是输入结构的详细说明: ID |开始日期|结束日期 1 | 16年1月15日| 16年2月15日 2016年1月23日至2016年3月15日 根据上面的表单,应用程序计算特定月份的天数。e、 g.对于ID=1,一月有16天,二月有14天。该表单将转换为以下输出: ID |月|天 1月16日 2014年2月1日 2008年1月2日 2月29日 2013年3月2日 有什么办法

我正试图破解一个逻辑,但到现在为止运气都不好。需要您的支持来解决问题。我需要计算开始日期和结束日期之间一个月内发生的天数

以下是输入结构的详细说明:

ID |开始日期|结束日期

1 | 16年1月15日| 16年2月15日

2016年1月23日至2016年3月15日

根据上面的表单,应用程序计算特定月份的天数。e、 g.对于ID=1,一月有16天,二月有14天。该表单将转换为以下输出:

ID |月|天

1月16日

2014年2月1日

2008年1月2日

2月29日

2013年3月2日

有什么办法可以做到以上几点吗?

看看


您可以用它来表示以天、小时甚至分钟为单位的时间间隔。

您需要拆分字段,然后解析日期,如:

DateTime.ParseExact(text, 
   "dd-MMM-yy", 
   CultureInfo.InvariantCulture,
   DateTimeStyles.AllowWhiteSpaces);
然后从初始日期循环到最后一个日期。我建议使用开始日期的第一天到循环的最后一个日期的第一天(否则,如果第一个月的日期大于最后一个月的日期,则无法执行最后一个月)。要增加,请使用AddMonth(1)方法。您可以使用
DateTime.DaysInMonth(年,月)
获取每个月的天数

对于第一个月,从该月的天数中减去第一个日期的日期

对于最后一个月,从最后一天减去1


对于其他月份,只需选择月份中的天数。

我相信您在问题中给出的结果是不正确的,但这是您可以做到的:

var obj = new[] {
    new { ID=1, StartDate=new DateTime(2016,1,15), EndDate=new DateTime(2016,2,15) },
    new { ID=2, StartDate=new DateTime(2016,1,23), EndDate=new DateTime(2016,3,15) }
};

var result=obj.SelectMany(x=>
    Enumerable.Range(0,int.MaxValue)
        .Select(m=>new DateTime(x.StartDate.Year,x.StartDate.Month,1).AddMonths(m))
        .TakeWhile(m=>m<x.EndDate)
        .Select(m=>new {
            x.ID,
            //m.Year,
            Month=m.ToString("MMM"),
            Days=(x.EndDate.Year==m.Year && x.EndDate.Month==m.Month?x.EndDate.Day:DateTime.DaysInMonth(m.Year,m.Month))
            -(x.StartDate.Year==m.Year && x.StartDate.Month==m.Month?x.StartDate.Day:0)
        })
);
var obj=new[]{
新{ID=1,StartDate=new DateTime(2016,1,15),EndDate=new DateTime(2016,2,15)},
新{ID=2,StartDate=new DateTime(2016,1,23),EndDate=new DateTime(2016,3,15)}
};
var result=obj.SelectMany(x=>
可枚举范围(0,int.MaxValue)
.Select(m=>newdatetime(x.StartDate.Year,x.StartDate.Month,1.AddMonths(m))
.TakeWhile(m=>mnew{
x、 身份证,
//m、 年,
月=m.ToString(“MMM”),
天=(x.EndDate.Year==m.Year&&x.EndDate.Month==m.Month?x.EndDate.Day:DateTime.DaysInMonth(m.Year,m.Month))
-(x.StartDate.Year==m.Year&&x.StartDate.Month==m.Month?x.StartDate.Day:0)
})
);

这里有一种使用小助手方法的方法:

var data = ranges
    .SelectMany(r => GetMonthlyDates(r.From, r.To)
        .Select(m => new
        {
            r.ID,
            MonthName = m.ToString("MMM"),
            Days = m.Year == r.From.Year && m.Month == r.From.Month
                ? DateTime.DaysInMonth(m.Year, m.Month) - m.Day
                : (m.Year == r.To.Year && m.Month == r.To.Month ? r.To.Day : DateTime.DaysInMonth(m.Year, m.Month))
        }));

private static IEnumerable<DateTime> GetMonthlyDates(DateTime from, DateTime to)
{
    for (DateTime current = from; current.Year < to.Year || current.Month <= to.Month; current = current.AddMonths(1))
        yield return current;
}

这看起来像是一个家庭作业问题。到目前为止你都试了些什么。您的代码在哪里?请注意,您的问题没有指定如何处理StartDate和EndDate之间的时间跨度超过一年的情况。我的代码将月份分开,但如果您需要将多年的月份合并为一个
Days
值,那就很简单了。答案还忽略了
EndDate
是包含的还是独占的,因为您的示例数据是冲突的。
1 | Jan | 16
1 | Feb | 15
2 | Jan | 8
2 | Feb | 29
2 | Mar | 15