简体   繁体   中英

Get first date of week and last date in current month in C#

Need help how to get first date and last date of a week in current month.

Below what I have done so far, but still fall for certain case especially where the start date and end date is sunday:

    var givenDate = new DateTime(2018,4,1);
    var intervalToStart = givenDate.DayOfWeek - DayOfWeek.Monday;
    var startDate = givenDate.AddDays(-intervalToStart);

    DateTime endDate;
    int intervalToEnd = 0; 

    if (startDate.Month != givenDate.Month)
        startDate = new DateTime(givenDate.Year, givenDate.Month, 1);

    var dayOfWeekStartDate = startDate.DayOfWeek.ToString().ToLower();

    switch (dayOfWeekStartDate)
        {
            case "sunday": intervalToEnd = 0;
                break;
            case "monday": intervalToEnd = 6;
                break;
            case "tuesday": intervalToEnd = 5;
                break;
            case "wednesday": intervalToEnd = 4;
                break;
            case "thursday": intervalToEnd = 3;
                break;
            case "friday": intervalToEnd = 2;
                break;
            case "saturday": intervalToEnd = 1;
                break;
        }

    endDate = startDate.AddDays(intervalToEnd);


    Console.WriteLine(startDate);
    Console.WriteLine(endDate);

Case 1:

  • Given date: 05 May 2018 (saturday)

  • First date of week: 01 May 2018 (tuesday)

  • Last date of week: 06 May 208 (sunday)

Case 2:

  • Given date: 09 May 2018 (wednesday)

  • First date of week: 07 May 2018 (monday)

  • Last date of week: 13 May 2018 (sunday)

Case 3:

  • Given date: 01 Apr 2018 (sunday)

  • First date of week: 01 Apr 2018 (sunday)

  • Last date of week: 01 Apr 2018 (sunday)

case 4:

  • Given date: 02 June 2018 (saturday)

  • First date of week: 01 June 2018 (friday)

  • Last date of week: 03 June 2018 (sunday)

Concept or answer is highly appreciated.

Thank you in advance.

You want to return the first day of the month if the monday would fall into the previous month?

public static Tuple<DateTime, DateTime> GetFirstAndLastWeekDate(DateTime dt, DayOfWeek firstDayOfWeek = DayOfWeek.Monday)
{
    int diff = (7 + (dt.DayOfWeek - firstDayOfWeek)) % 7;
    DateTime firstDay = dt.AddDays(-1 * diff).Date;
    DateTime lastDay = firstDay.AddDays(6);
    if (dt.Month != firstDay.Month)
    {
        firstDay = new DateTime(dt.Year, dt.Month, 1);
    }

    return Tuple.Create(firstDay, lastDay);
}

Use DateTime.DayOfWeek

and the code would be like this

var givenDate = new DateTime(2018, 4, 1);
int addMax = DateTime.DaysInMonth(givenDate.Year, givenDate.Month) - givenDate.Day;
int add = Math.Min(addMax, ((DayOfWeek.Saturday - givenDate.DayOfWeek) + 1) % 7);

int subMax = givenDate.Day - 1;
int sub = Math.Min(subMax, (givenDate.DayOfWeek - DayOfWeek.Monday + 7) % 7);

var firstDate = givenDate.AddDays(-sub);
var lastDate = givenDate.AddDays(add);
Console.Write("Give: {0}({1})\nFirst: {2}({3})\nLast: {4}({5})", 
    givenDate, givenDate.DayOfWeek, 
    firstDate, firstDate.DayOfWeek, 
    lastDate, lastDate.DayOfWeek);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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