根据“日期”字段查找一周的星期一

时间:2013-04-24 12:00:54

标签: vb.net

这是我的问题,我想以日期格式返回给定周的星期一。

到目前为止,我付出了努力。

代码:

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

但是,这很不幸在18/12/1899回归。不完全是我想要的...... 2013年会很好。我出错的地方有哪些提示?

注意:

从数据库表中提取的特定日期是在不同的应用程序中完成的。此代码应生成一个日期,该日期将显示在标签上。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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