繁体   English   中英

日期范围在C#中拆分

[英]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
    };

它重复多年来,从startend ,然后在几个月迭代每年,与边缘案件(特殊处理isStartisEnd )。 这个基本算法可以封装在这样的函数中:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM