Получить первую дату недели и последнюю дату в текущем месяце в C # - PullRequest
0 голосов
/ 24 апреля 2018

Нужна помощь, как получить первую дату и последнюю дату недели в текущем месяце.

Ниже того, что я сделал до сих пор, но все еще подпадают под определенный случай, особенно когда дата начала и дата окончания - воскресенье:

    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);

Случай 1:

  • Заданная дата: 05 мая 2018 года (суббота)

  • Первое число недели: 01 мая 2018 года (вторник)

  • Последняя неделя недели: 06 мая 208 (воскресенье)

Дело 2:

  • Заданная дата: 09 мая 2018 года (среда)

  • Первое число недели: 07 мая 2018 года (понедельник)

  • Последняя дата недели: 13 мая 2018 (воскресенье)

Дело 3:

  • Заданная дата: 01 апреля 2018 года (воскресенье)

  • Первое число недели: 01 апреля 2018 года (воскресенье)

  • Последняя неделя недели: 01 апреля 2018 (воскресенье)

дело 4:

  • Указана дата: 02 июня 2018 года (суббота)

  • Первое число недели: 01 июня 2018 (пятница)

  • Последняя неделя недели: 3 июня 2018 (воскресенье)

Концепция или ответ высоко ценится.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Использование DateTime.DayOfWeek

и код будет таким

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);
0 голосов
/ 24 апреля 2018

Вы хотите вернуть первый день месяца, если понедельник выпадет в предыдущий месяц?

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...