这是我的问题,我想以日期格式返回给定周的星期一。
到目前为止,我付出了努力。
代码:
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年会很好。我出错的地方有哪些提示?
注意:
从数据库表中提取的特定日期是在不同的应用程序中完成的。此代码应生成一个日期,该日期将显示在标签上。
答案 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