2016-01-08 5 views
1

Я использовал следующий код для определения даты на каждый день на следующей неделе:VB.NET Получить дату следующей недели

Dim someDate As DateTime = Date.Today 

    Dim nextMonday As DateTime = someDate 
    While nextMonday.DayOfWeek <> DayOfWeek.Monday 
     nextMonday = nextMonday.AddDays(1) 
    End While 

    Dim nextTuesday As DateTime = someDate 
    While nextTuesday.DayOfWeek <> DayOfWeek.Tuesday 
     nextTuesday = nextTuesday.AddDays(1) 
    End While 

Он отлично работает, для будущего дня, который так же, как за исключением текущий день. Например. сегодня пятница 8/1/2016, и код возвращается также 8/1/2016, где он должен фактически вернуться 15/1/2016. Все даты для других дней верны. Любые идеи?

С уважением

+0

Вы можете добавить 1 день Сегодня, чтобы ваши циклы запуска на следующий день (конечно, это означает, что поиск понедельника 11/1/2016 возвращается 18/1/2016. Это приемлемо? – Steve

+0

Спасибо Steve.That работает для меня. – Gideon

ответ

1

Вы можете использовать следующий метод расширения:

<System.Runtime.CompilerServices.Extension()> _ 
Public Function StartOfWeek(dt As DateTime, firstDayOfWeek As DayOfWeek) As DateTime 
    Dim diff As Int32 = dt.DayOfWeek - firstDayOfWeek 
    If diff < 0 Then 
     diff += 7 
    End If 

    Return dt.AddDays(-1 * diff).Date 
End Function 

Если вы хотите полный следующей неделе в List(Of Date):

Dim startOfNextWeek As Date = Date.Today.AddDays(7).StartOfWeek(DayOfWeek.Monday) 
Dim nextWeek = Enumerable.Range(0, 7).Select(Function(d) startOfNextWeek.AddDays(d)).ToList() 

То же без LINQ:

Dim nextWeek As New List(Of Date) 
For d As Int32 = 0 To 6 
    nextWeek.Add(startOfNextWeek.AddDays(d)) 
Next 
0

Вы бы гораздо лучше использовали функцию, которая перебирает значения. Нечто подобное должно делать то, что вы хотите:

Public Function FindNextDayOfWeek(startDate As Date, dayToFind As DayOfWeek) As Date 
    Dim adjustment = 6 + (dayToFind - startDate.DayOfWeek) 
    If adjustment > 7 Then adjustment -= 7 
    Return startDate.AddDays(adjustment) 
End Function 

Тесты:

FindNextDayOfWeek(#2015-01-13#, DayOfWeek.Tuesday) 'returns 19/01/2015 
FindNextDayOfWeek(#2015-01-11#, DayOfWeek.Wednesday) ' returns 13/01/2015 
FindNextDayOfWeek(#2015-01-11#, DayOfWeek.Monday) 'returns 18/01/2015 
+0

Это не работает, если 'dayToFind' * после * 's tartDate.DayOfWeek' –

+0

@roryap спасибо изменили в соответствии с тестом –

+0

Кроме того, у вас есть магические числа. Вы должны сделать их константами –

0

Этот метод должен работать для вас:

Private Function GetNextDayOfWeek(afterDate As Date, targetDayOfWeek As DayOfWeek) As DateTime 
    Const TotalDaysInWeek = DayOfWeek.Saturday - DayOfWeek.Sunday + 1 '+1 to account for zero indexed. 
    Dim daysToAdd As Integer 

    Select Case targetDayOfWeek 
     Case Is < afterDate.DayOfWeek 
      daysToAdd = afterDate.DayOfWeek - targetDayOfWeek - 1 
     Case Is = afterDate.DayOfWeek 
      daysToAdd = TotalDaysInWeek 'need to find exactly one week from "afterDate" 
     Case Is > afterDate.DayOfWeek 
      daysToAdd = targetDayOfWeek - afterDate.DayOfWeek 
    End Select 

    Return afterDate.AddDays(daysToAdd) 
End Function 
Смежные вопросы