Поиск даты понедельника в неделю с помощью VB.NET

Мне нужно найти способ найти дату (DD/MM/YYYY) в понедельник в течение любой недели, в которой мы находимся.

Например, на этой неделе, понедельник - 09/11/2009, и если бы это была следующая неделя, это было бы 16/11/2009.

Мне удалось попасть где-нибудь в формы кода, но все, что у меня было, было "невозможно преобразовать в Integer". Я использовал Date.Today и AddDays().

Спасибо за любую помощь.:)

Ответы

Ответ 1

Если воскресенье - первый день недели, вы можете просто сделать это:

Dim today As Date = Date.Today
Dim dayDiff As Integer = today.DayOfWeek - DayOfWeek.Monday
Dim monday As Date = today.AddDays(-dayDiff)

Если понедельник - первый день недели:

Dim today As Date = Date.Today
Dim dayIndex As Integer = today.DayOfWeek
If dayIndex < DayOfWeek.Monday Then
    dayIndex += 7 'Monday is first day of week, no day of week should have a smaller index
End If
Dim dayDiff As Integer = dayIndex - DayOfWeek.Monday
Dim monday As Date = today.AddDays(-dayDiff)

Ответ 2

DateTime.DayOfWeek - это перечисление, указывающее, в какой день указанная дата. Понедельник 1, вы можете найти понедельник текущей недели, используя следующий код:

Dim monday As DateTime = Today.AddDays((Today.DayOfWeek - DayOfWeek.Monday) * -1)

Ответ 3

=Format(DateAdd("d", (-1 * WeekDay(Date.Today()) + 2), Date.Today()), "dd/MM/yyyy")

Ответ 4

Простой метод должен предоставить вам то, что вы хотите:

    private static DateTime GetMondayForWeek(DateTime inputDate)
    {
        int daysFromMonday = inputDate.DayOfWeek - DayOfWeek.Monday;
        return inputDate.AddDays(-daysFromMonday);
    }

Вы также можете продлить его на любой день, который вы хотите:

    private static DateTime GetDayForWeek(DateTime inputDate, DayOfWeek inputDay)
    {
        int daysAway = inputDate.DayOfWeek - inputDay;
        return inputDate.AddDays(-daysAway);
    }

Для вызова первого примера просто используйте что-то вроде:

DateTime mondayDate = GetMondayForWeek(new DateTime(2009, 11, 15));
Console.WriteLine(mondayDate);

Ответ 5

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

 Dim today As Date = Date.Today
                Dim dayDiff As Integer = today.DayOfWeek - DayOfWeek.Monday
                Dim monday As Date = today.AddDays(-dayDiff)

                dayDiff = DayOfWeek.Saturday - today.DayOfWeek + 1
                Dim sunday As Date = today.AddDays(dayDiff)

Ответ 7

Я просто сделал это в проекте, над которым я работаю - я обещаю, это правильно. Это метод, который возвращает n-й понедельник после указанной даты. Если данная дата является понедельником, она возвращается в следующий понедельник.

Public Function GetSubsequentMonday(ByVal startDate As DateTime, ByVal subsequentWeeks As Integer) As DateTime
    Dim dayOfWeek As Integer = CInt(startDate.DayOfWeek)
    Dim daysUntilMonday As Integer = (Math.Sign(dayOfWeek) * (7 - dayOfWeek)) + 1
    'number of days until the next Monday
    Return startDate.AddDays(CDbl((daysUntilMonday + (7 * (subsequentWeeks - 1)))))
End Function

Ответ 8

Следуя моим комментариям к ответу на Meta-Knight, вот короткая функция, которая делает исправление, которое я упоминаю в комментариях:

Public Function GetFirstOfLastWeek() As DateTime
Dim today As DateTime, daysSinceMonday As Integer
    today = DateTime.Today
    daysSinceMonday = today.DayOfWeek - DayOfWeek.Monday
    If daysSinceMonday < 0 Then
        daysSinceMonday += 7
    End If
    Return today.AddDays(-daysSinceMonday)  
End Function

Ответ 9

И если ваша неделя начинается с понедельника, вы можете использовать что-то вроде этого:

DateTime mondayDate = DateTime.Now.AddDays(((DateTime.Now.DayOfWeek == DayOfWeek.Sunday?7: (int)DateTime.Now.DayOfWeek) - 1)*-1);

DateTime sundayDate = DateTime.Now.AddDays(7 - (DateTime.Now.DayOfWeek == DayOfWeek.Sunday?7: (int)DateTime.Now.DayOfWeek ));