[英]Date range Split in C#
我需要在C#中将给定开始日期和结束日期的月份分开
用户输入示例:
Start date : 5/20/2013
End date : 11/11/2013
我想在一个月内拆分给出日期差异
输出:
StartDate EndDate NumberOfMonth
5/20/2013 5/31/2013 .5
6/1/2013 6/30/2013 1
7/1/2013 7/31/2013 1
8/1/2013 8/31/2013 1
9/1/2013 9/30/2013 1
10/1/2013 10/31/2013 1
11/1/2013 11/11/2013 .5
我会抓住这个...你可以使用Linq一次生成所有日期范围。 这不是最漂亮的查询,但它确实有效。
DateTime start = ...
DateTime end = ...
var cal = System.Globalization.CultureInfo.CurrentCulture.Calendar;
var range =
from y in Enumerable.Range(start.Year, end.Year - start.Year + 1)
let maxMonth = y < end.Year ? cal.GetMonthsInYear(y) : end.Month
let minMonth = y > start.Year ? 1 : start.Month
from m in Enumerable.Range(minMonth, maxMonth - minMonth + 1)
let isStart = (y == start.Year && m == start.Month)
let isEnd = (y == end.Year && m == end.Month)
select new
{
StartDate = isStart ? start : new DateTime(y, m, 1),
EndDate = isEnd ? end : new DateTime(y, m, cal.GetDaysInMonth(y, m)),
NumberOfMonths = isStart || isEnd ? .5 : 1
};
它重复多年来,从start
到end
,然后在几个月迭代每年,与边缘案件(特殊处理isStart
和isEnd
)。 这个基本算法可以封装在这样的函数中:
public class DateTimeRange
{
Date StartDate { get; set; }
Date EndDate { get; set; }
float NumberOfMonths { get; set; }
}
public static IEnumerable<DateTimeRange> SplitByMonths(DateTime start,
DateTime end,
Calendar cal)
{
return (
from y in Enumerable.Range(start.Year, end.Year - start.Year + 1)
let maxMonth = y < end.Year ? cal.GetMonthsInYear(y) : end.Month
let minMonth = y > start.Year ? 1 : start.Month
from m in Enumerable.Range(minMonth, maxMonth - minMonth + 1)
let isStart = (y == start.Year && m == start.Month)
let isEnd = (y == end.Year && m == end.Month)
select new DateTimeRange
{
StartDate = isStart ? start : new DateTime(y, m, 1),
EndDate = isEnd ? end : new DateTime(y, m, cal.GetDaysInMonth(y, m)),
NumberOfMonths = isStart || isEnd ? .5 : 1
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.