按月和周数c#获取日期范围 [英] Get Date Range by month and week number c#

查看:76
本文介绍了按月和周数c#获取日期范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以帮我编写一个C#方法,将下面显示的格式数据提取到IEnumebrable中。



我需要将日期范围隔离开来月份也从星期日开始,到星期六结束。



 MM WeekNo  Week_StartDate   Week_EndDate  
------------------------------------------
01 1 01-JAN-13 05-JAN-13
01 2 06-JAN-13 12-JAN-13
01 3 13-JAN-13 19-JAN-13
01 4 20-JAN-13 26-JAN-13
01 5 27-JAN-13 31-JAN-13

02 1 01-FEB-13 02-FEB-13
02 2 03-FEB-13 09-FEB-13
02 3 10-FEB-13 16-FEB-13
02 4 17-FEB -13 23-FEB-13
02 5 24-FEB-13 28-FEB-13

解决方案

使用System; 
使用System.Collections.Generic;
使用System.Linq;
使用System.Text;
使用System.Collections.Specialized;
使用System.Collections;

namespace WeekRange
{
class program
{
static void Main(string [] args)
{
foreach( WeekRange wr in GetWeekRange(new DateTime(2015,01,05),new DateTime(2015,04,05)))
{
Console.WriteLine({0} {1} {2} { 3,wr.WeekNo,wr.MM,wr.Start.Date.ToShortDateString(),wr.End.ToShortDateString());
}
Console.ReadLine();
}

public static IEnumerable< WeekRange> GetWeekRange(DateTime dtStart,DateTime dtEnd)
{
DateTime fWeekStart,dt,fWeekEnd;
int wkCnt = 1;

if(dtStart.DayOfWeek!= DayOfWeek.Sunday)
{
fWeekStart = dtStart.AddDays(7 - (int)dtStart.DayOfWeek);
fWeekEnd = fWeekStart.AddDays(-1);
IEnumerable< WeekRange> ranges = getMonthRange(new WeekRange(dtStart,fWeekEnd,dtStart.Month,wkCnt ++));
foreach(WeekRange wr in range)
{
yield return wr;
}
wkCnt = ranges.Last()。WeekNo + 1;

}
其他
{
fWeekStart = dtStart;
}


for(dt = fWeekStart.AddDays(6); dt< = dtEnd; dt = dt.AddDays(7))
{


IEnumerable< WeekRange> ranges = getMonthRange(new WeekRange(fWeekStart,dt,fWeekStart.Month,wkCnt ++));
foreach(WeekRange wr in range)
{
yield return wr;
}
wkCnt = ranges.Last()。WeekNo + 1;
fWeekStart = dt.AddDays(1);


}

if(dt> dtEnd)
{

IEnumerable< WeekRange> ranges = getMonthRange(new WeekRange(fWeekStart,dtEnd,dtEnd.Month,wkCnt ++));
foreach(WeekRange wr in range)
{
yield return wr;
}
wkCnt = ranges.Last()。WeekNo + 1;

}

}


公共静态IEnumerable< WeekRange> getMonthRange(WeekRange weekRange)
{

List< WeekRange> ranges = new List< WeekRange>();

if(weekRange.Start.Month!= weekRange.End.Month)
{
DateTime lastDayOfMonth = new DateTime(weekRange.Start.Year,weekRange.Start.Month, 1).AddMonths(1).AddDays(-1);
ranges.Add(new WeekRange(weekRange.Start,lastDayOfMonth,weekRange.Start.Month,weekRange.WeekNo));
ranges.Add(new WeekRange(lastDayOfMonth.AddDays(1),weekRange.End,weekRange.End.Month,weekRange.WeekNo + 1));

}
else
{
ranges.Add(weekRange);
}

返回范围;

}

}


struct WeekRange
{
public DateTime Start;
public DateTime End;
public int MM;
public int WeekNo;

public WeekRange(DateTime _start,DateTime _end,int _mm,int _weekNo)
{
Start = _start;
结束= _end;
MM = _mm;
WeekNo = _weekNo;
}

}

}


 < span class =code-keyword> public   class  WeekRange 
{
public string 范围{ get ; set ; }
public DateTime StartDate { get ; set ; }
public DateTime EndDate { get ; set ; }
public int 周{ get ; set ; }
public int 月{ get ; set ; }
public int 年{获取; set ; }
}

public 列表< weekrange> WeekDays(DateTime startDate,DateTime endDate)
{
DateTime startDateToCheck = startDate;
DateTime dateToCheck = startDate;
DateTime dateRangeBegin = dateToCheck;
DateTime dateRangeEnd = endDate;

列表< weekrange> weekRangeList = new 列表< weekrange>();
WeekRange weekRange = new WeekRange();


while ((startDateToCheck.Year < = endDate .Year)&&(startDateToCheck.Month < = endDate.Month)&& dateToCheck < = endDate)
{
int week = 0 ;

while (startDateToCheck.Month == dateToCheck.Month&& dateToCheck < = endDate)
{
周=周+ 1 ;
dateRangeBegin = dateToCheck.AddDays( - ( int )dateToCheck.DayOfWeek);
dateRangeEnd = dateToCheck.AddDays( 6 - ( int )dateToCheck.DayOfWeek);

if ((dateRangeBegin.Date < dateToCheck)&& (dateRangeBegin.Date.Month!= dateToCheck.Month))
{
dateRangeBegin = new DateTime(dateToCheck.Year,dateToCheck.Month,dateToCheck 。天);
}

如果((dateRangeEnd.Date > dateToCheck )&&(dateRangeEnd.Date.Month!= dateToCheck.Month))
{
DateTime dtTo = new DateTime(dateToCheck.Year) ,dateToCheck.Month, 1 );
dtTo = dtTo.AddMonths( 1 );
dateRangeEnd = dtTo.AddDays( - (dtTo.Day));
}
如果(dateRangeEnd.Date > endDate)
{
dateRangeEnd = new DateTime(dateRangeEnd.Year,dateRangeEnd.Month,endDate.Day);
}
weekRange = new WeekRange
{
StartDate = dateRangeBegin,
EndDate = dateRangeEnd,
Range = dateRangeBegin.Date.ToShortDateString()+ ' - ' + dateRangeEnd.Date.ToShortDateString( ),
Month = dateToCheck.Month,
Year = dateToCheck.Year,
Week = week
};
weekRangeList.Add(weekRange);
dateToCheck = dateRangeEnd.AddDays( 1 );
}
startDateToCheck = startDateToCheck.AddMonths( 1 );
}

return weekRangeList;
} < / weekrange > < / weekrange > < / weekrange >


Can some one help me to write a C# method to fetch the below shown format data in to a IEnumebrable .

I need to get the date range segregated along with the month also starting with Sunday and ends with Saturday.

MM   WeekNo Week_StartDate  Week_EndDate
------------------------------------------
01       1      01-JAN-13     05-JAN-13
01       2      06-JAN-13     12-JAN-13
01       3     13-JAN-13      19-JAN-13
01       4      20-JAN-13     26-JAN-13
01       5     27-JAN-13      31-JAN-13

02       1     01-FEB-13      02-FEB-13
02       2     03-FEB-13      09-FEB-13
02       3     10-FEB-13      16-FEB-13
02       4     17-FEB-13      23-FEB-13
02       5     24-FEB-13      28-FEB-13

解决方案

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
using System.Collections;

namespace WeekRange
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (WeekRange wr in GetWeekRange(new DateTime(2015, 01, 05), new DateTime(2015, 04, 05)))
            {
                Console.WriteLine("{0} {1} {2} {3}", wr.WeekNo, wr.MM, wr.Start.Date.ToShortDateString(), wr.End.ToShortDateString());
            }
            Console.ReadLine();
        }

        public static IEnumerable<WeekRange> GetWeekRange(DateTime dtStart, DateTime dtEnd)
        {
            DateTime fWeekStart, dt, fWeekEnd;
            int wkCnt = 1;

            if (dtStart.DayOfWeek != DayOfWeek.Sunday)
            {
                fWeekStart = dtStart.AddDays(7 - (int)dtStart.DayOfWeek);
                fWeekEnd = fWeekStart.AddDays(-1);
                IEnumerable<WeekRange> ranges = getMonthRange(new WeekRange(dtStart, fWeekEnd, dtStart.Month, wkCnt++));
                foreach (WeekRange wr in ranges)
                {
                    yield return wr;
                }
                wkCnt = ranges.Last().WeekNo+1;

            }
            else
            {
                fWeekStart = dtStart;
            }


            for (dt = fWeekStart.AddDays(6); dt <= dtEnd; dt = dt.AddDays(7))
            {


                IEnumerable<WeekRange> ranges = getMonthRange(new WeekRange(fWeekStart, dt, fWeekStart.Month, wkCnt++));
                foreach (WeekRange wr in ranges)
                {
                    yield return wr;
                }
                wkCnt = ranges.Last().WeekNo + 1;
                fWeekStart = dt.AddDays(1);


            }

            if (dt > dtEnd)
            {

                IEnumerable<WeekRange> ranges = getMonthRange(new WeekRange(fWeekStart, dtEnd, dtEnd.Month, wkCnt++));
                foreach (WeekRange wr in ranges)
                {
                    yield return wr;
                }
                wkCnt = ranges.Last().WeekNo + 1;

            }

        }


        public static IEnumerable<WeekRange> getMonthRange(WeekRange weekRange)
        {

            List<WeekRange> ranges = new List<WeekRange>();

            if (weekRange.Start.Month != weekRange.End.Month)
            {
                DateTime lastDayOfMonth = new DateTime(weekRange.Start.Year, weekRange.Start.Month, 1).AddMonths(1).AddDays(-1);
                ranges.Add(new WeekRange(weekRange.Start, lastDayOfMonth, weekRange.Start.Month, weekRange.WeekNo));
                ranges.Add(new WeekRange(lastDayOfMonth.AddDays(1), weekRange.End, weekRange.End.Month, weekRange.WeekNo + 1));

            }
            else
            {
                ranges.Add(weekRange);
            }

            return ranges;

        }

    }


    struct WeekRange
    {
        public DateTime Start;
        public DateTime End;
        public int MM;
        public int WeekNo;

        public WeekRange(DateTime _start, DateTime _end, int _mm, int _weekNo)
        {
            Start = _start;
            End = _end;
            MM = _mm;
            WeekNo = _weekNo;
        }

    }

}


public class WeekRange
    {
        public string Range { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
        public int Week { get; set; }
        public int Month { get; set; }
        public int Year { get; set; }
    }

        public List<weekrange> WeekDays(DateTime startDate, DateTime endDate)
        {
            DateTime startDateToCheck = startDate;
            DateTime dateToCheck = startDate;
            DateTime dateRangeBegin = dateToCheck;
            DateTime dateRangeEnd = endDate;

            List<weekrange> weekRangeList = new List<weekrange>();
            WeekRange weekRange = new WeekRange();


            while ((startDateToCheck.Year <= endDate.Year) && (startDateToCheck.Month <= endDate.Month) && dateToCheck <= endDate)
            {
                int week = 0;

                while (startDateToCheck.Month == dateToCheck.Month && dateToCheck <= endDate)
                {
                    week = week + 1;
                    dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek);
                    dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek);

                    if ((dateRangeBegin.Date < dateToCheck) && (dateRangeBegin.Date.Month != dateToCheck.Month))
                    {
                        dateRangeBegin = new DateTime(dateToCheck.Year, dateToCheck.Month, dateToCheck.Day);
                    }

                    if ((dateRangeEnd.Date > dateToCheck) && (dateRangeEnd.Date.Month != dateToCheck.Month))
                    {
                        DateTime dtTo = new DateTime(dateToCheck.Year, dateToCheck.Month, 1);
                        dtTo = dtTo.AddMonths(1);
                        dateRangeEnd = dtTo.AddDays(-(dtTo.Day));
                    }
                    if (dateRangeEnd.Date > endDate)
                    {
                        dateRangeEnd = new DateTime(dateRangeEnd.Year, dateRangeEnd.Month, endDate.Day);
                    }
                    weekRange = new WeekRange
                    {
                        StartDate = dateRangeBegin,
                        EndDate = dateRangeEnd,
                        Range = dateRangeBegin.Date.ToShortDateString() + '-' + dateRangeEnd.Date.ToShortDateString(),
                        Month = dateToCheck.Month,
                        Year = dateToCheck.Year,
                        Week = week
                    };
                    weekRangeList.Add(weekRange);
                    dateToCheck = dateRangeEnd.AddDays(1);
                }
                startDateToCheck = startDateToCheck.AddMonths(1);
            }

            return weekRangeList;
        }</weekrange></weekrange></weekrange>


这篇关于按月和周数c#获取日期范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆