我试图破解逻辑,但直到现在都没有运气。需要您的支持才能解决问题。我需要计算开始日期和结束日期之间一个月内发生的天数。
详细说明,以下是输入结构:
ID |开始日期|结束日期
1 | 15-Jan-16 | 15-Feb-16
2 | 23-Jan-16 | 15-Mar-16
从上面的表格中,应用程序计算特定月份的天数。例如对于ID = 1,Jan有16天,2月有14天。表单将转换为以下输出:
ID |月|天
1 | Jan | 16
1 |二月| 14
2 | Jan | 8
2 |二月| 29
2 | Mar | 13
有什么方法可以做到吗?
答案 0 :(得分:1)
查看TimeSpan。
您可以使用它来表示以天,小时甚至分钟为单位的时间间隔。
答案 1 :(得分: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)
})
);
答案 2 :(得分:0)
您需要拆分字段,然后解析日期,例如:
DateTime.ParseExact(text,
"dd-MMM-yy",
CultureInfo.InvariantCulture,
DateTimeStyles.AllowWhiteSpaces);
然后从初始日期循环到最后一个日期。我建议使用开始日期的第一天到循环的最后一个日期的第一天(否则如果第一个月的日期大于上个月的那天,则无法执行上个月)。要增加,请使用AddMonth(1)方法。您可以使用DateTime.DaysInMonth(year,month)
获取每月的天数。
第一个月,从该月的日期中减去第一个日期的日期。
上个月,从最后一天的日期减去1。
其他月份,只需选择月中的日子。
答案 3 :(得分: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;
}
这给了我:
1 | Jan | 16
1 | Feb | 15
2 | Jan | 8
2 | Feb | 29
2 | Mar | 15