Получить дату предыдущего понедельника

Я пытаюсь узнать дату понедельника на текущей неделе. Это близко к правильному?

Dim MondayOfCurrentWeek As Date = Date.Today - Date.Today.DayOfWeek + 1

Насколько я понимаю, индексы AyOfWeek следующие:

1 = Monday
2 = Tuesday
3 = Wednesday
4 = Thursday
5 = Friday
6 = Saturday
0 = Sunday

Следовательно, если, например, Date Today - четверг, я бы получил:

Dim MondayOfCurrentWeek As Date = Date - 4 + 1 

что было бы равно

Date - 3

и мне кажется правильным.

Или я совсем выключен?


person user1283776    schedule 12.01.2015    source источник
comment
Это C #, но есть полу- дублируйте здесь, где есть удобная функция, которую можно использовать в любой день недели.   -  person James Thorpe    schedule 12.01.2015
comment
С другой стороны, хотя Enums не должны меняться в будущих выпусках, всегда есть шанс, что они могут. Я бы очень осторожно выполнял арифметические операции, основанные на значении Enum.   -  person James Thorpe    schedule 12.01.2015
comment
Зачем ему использовать перечисление? Дни недели встроены в платформу .NET.   -  person    schedule 12.01.2015
comment
@Hypenate DayOfWeek is перечисление.   -  person James Thorpe    schedule 12.01.2015
comment
Думал, что он хочет создать для этого собственное перечисление ...   -  person    schedule 12.01.2015
comment
FWIW - разве воскресенье не 0?   -  person dbasnett    schedule 12.01.2015
comment
Воскресенье 0, моя ошибка   -  person user1283776    schedule 12.01.2015


Ответы (4)


Очень простой альтернативный подход, который, вероятно, не так эффективен, но позволяет избежать каких-либо арифметических ошибок:

Dim monday As Date = Date.Today
While (monday.DayOfWeek <> DayOfWeek.Monday)
    monday = monday.AddDays(-1)
End While

Это можно легко расширить до функции, обрабатывающей любой день недели. Если это не действительно большой фрагмент кода, производительность будет хорошей.

person James Thorpe    schedule 12.01.2015
comment
@ Матт В самом деле. Но ОП был именно после понедельника, а не в день старта. - person James Thorpe; 12.01.2015
comment
На самом деле он специально после понедельника на текущей неделе, а не в предыдущий понедельник. - person Matt Wilko; 12.01.2015
comment
@ Мэтт А, да, я понимаю, к чему вы клоните - person James Thorpe; 12.01.2015
comment
Я недостаточно уточнил свой вопрос. Я недостаточно обдумал это. Но предыдущий понедельник, который получил этот ответ, как раз то, что мне было нужно. - person user1283776; 12.01.2015

Это должно делать то, что вы хотите. Он находит предыдущий понедельник с указанной даты. Здесь нет циклов, поэтому будет быстро и не зависит от значения перечисления для выполнения арифметической корректировки, поэтому не сломается, если значения перечисления когда-либо изменятся:

Public Shared Function PreviousMonday(ByVal dateValue As DateTime) As DateTime
    Dim dayOffset As Integer
    Select Case dateValue.DayOfWeek
        Case DayOfWeek.Sunday : dayOffset = 6
        Case DayOfWeek.Monday : dayOffset = 0
        Case DayOfWeek.Tuesday : dayOffset = 1
        Case DayOfWeek.Wednesday : dayOffset = 2
        Case DayOfWeek.Thursday : dayOffset = 3
        Case DayOfWeek.Friday : dayOffset = 4
        Case DayOfWeek.Saturday : dayOffset = 5
    End Select

    Return dateValue.AddDays(-1 * dayOffset)
End Function
person Matt Wilko    schedule 12.01.2015

Если вы ищете диапазон с понедельника по воскресенье на предыдущей неделе, вы можете получить их с помощью этих функций (измененная версия из ответа Мэтта Вилко).

Public Shared Function PreviousMonday(ByVal dateValue As Date) As Date
Dim dayOffset As Integer
Select Case dateValue.DayOfWeek
    Case DayOfWeek.Sunday : dayOffset = -13
    Case DayOfWeek.Monday : dayOffset = -7
    Case DayOfWeek.Tuesday : dayOffset = -8
    Case DayOfWeek.Wednesday : dayOffset = -9
    Case DayOfWeek.Thursday : dayOffset = -10
    Case DayOfWeek.Friday : dayOffset = -11
    Case DayOfWeek.Saturday : dayOffset = -12
End Select

Return dateValue.AddDays(dayOffset)
End Function

Public Shared Function PreviousSunday(ByVal dateValue As Date) As Date
Dim dayOffset As Integer
Select Case dateValue.DayOfWeek
    Case DayOfWeek.Sunday : dayOffset = -7
    Case DayOfWeek.Monday : dayOffset = -1
    Case DayOfWeek.Tuesday : dayOffset = -2
    Case DayOfWeek.Wednesday : dayOffset = -3
    Case DayOfWeek.Thursday : dayOffset = -4
    Case DayOfWeek.Friday : dayOffset = -5
    Case DayOfWeek.Saturday : dayOffset = -6
End Select

Return dateValue.AddDays(dayOffset)
End Function
person Timo Riikonen    schedule 23.06.2020

person    schedule
comment
Как правило, ответы намного полезнее, если они включают объяснение того, для чего предназначен код, и почему это решает проблему, не вводя других. - person DCCoder; 18.09.2020