Поиск даты понедельника в неделю с помощью 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)
Ответ 6
Существует метод дня недели, который вы можете использовать
Dim instance As DateTime
Dim value As DayOfWeek
value = instance.DayOfWeek
см.: http://msdn.microsoft.com/en-us/library/system.datetime.dayofweek.aspx
Ответ 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 ));