2013-04-24 3 views
2

Это моя проблема, я хочу вернуть понедельник данной даты в формате даты.Найти понедельник недели, на основе поля «Дата»

Здесь у меня есть мои усилия.

Код:

Dim Diff 
Dim cDate 
Dim prday 
prday = [table.datefield] 
Diff = Cint(0 - (Weekday(prday, 2))) 
cDate = DateAdd("d", Diff, prday) 
Result = cDate 

Однако это, скорее, к сожалению, возвращает 24/12/1899. Не совсем то, что я хочу. 2013 год будет приятным. Какие-нибудь советы о том, где я ошибся?

Примечание:

Конкретная дата, которая извлекается из таблицы базы данных выполняется в другом приложении. Этот код должен генерировать дату, которая будет отображаться на ярлыке.

+1

Возможный дубликат http://stackoverflow.com/questions/1710487/finding-the-date-of-monday-in-a-week-with-vb-net –

ответ

7

Единственная проблема заключается в том, как вы хотите лечить воскресные даты.

'Sunday as first day of week 
Dim someDate As DateTime = DateTime.Parse("Apr 28, 2013") 
'calculate monday 
'note: for Sunday this returns next Monday, i.e Apr 28, 2013 returns Apr 29th 
Dim monDate As DateTime = someDate.AddDays(DayOfWeek.Monday - someDate.DayOfWeek) 

'Monday as first day of week 
Dim someDate As DateTime = DateTime.Parse("Apr 28, 2013") 
'calculate monday 
If someDate.DayOfWeek = DayOfWeek.Sunday Then someDate = someDate.AddDays(-1) 
Dim monDate As DateTime = someDate.AddDays(DayOfWeek.Monday - someDate.DayOfWeek) 
+0

I прошу прощения, чтобы заимствовать вашу идею, чтобы лучше ответить ... – Steve

2

Определить метод расширения

Imports System.Runtime.CompilerServices 

Module DateExtensions 

    <Extension()> 
    Public Function GetMonday(ByVal dt As DateTime) as DateTime 
     While dt.DayOfWeek <> DayOfWeek.Monday 
      dt = dt.AddDays(-1) 
     End While 
     return dt 
    End Function 
End Module 

И называют его

prday = prday.GetMonday() 

Или мы могли бы сделать это родовое

Public Function GetPreviousDayOfWeek(ByVal dt As DateTime, prevDay As DayOfWeek) as DateTime 
    While dt.DayOfWeek <> prevDay 
     dt = dt.AddDays(-1) 
    End While 
    return dt 
End Function 

Как отметил @dbasnett математика является быстрее, чем цикл, и мы могли бы справиться с ситуация, когда воскресенье - первый день недели. Таким образом, лучший подход должен быть

Public Function GetMonday(ByVal dt As DateTime) as DateTime 
    Dim diff = Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek - DayOfWeek.Monday 
    dt = dt.AddDays(diff) 
    return dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek) 
End Function 
+0

Цикл вместо простой математики ???? Что делать, если понедельник - первый день недели? – dbasnett

+0

Не спорь с этим, просто чтобы показать метод расширения. – Steve

Смежные вопросы