Vb.net 获取当前周的日期无法按预期工作

Vb.net 获取当前周的日期无法按预期工作,vb.net,datetime,Vb.net,Datetime,我正在尝试获取本周的日期(周一至周日) 这是我当前的代码: Dim kw As Integer = DatePart(DateInterval.WeekOfYear, Now, , FirstWeekOfYear.FirstFourDays) If DatePart(DateInterval.Weekday, Now, Microsoft.VisualBasic.FirstDayOfWeek.Sunday) = 6 Then kw

我正在尝试获取本周的日期(周一至周日)

这是我当前的代码:

    Dim kw As Integer = DatePart(DateInterval.WeekOfYear, Now, , FirstWeekOfYear.FirstFourDays)
            If DatePart(DateInterval.Weekday, Now, Microsoft.VisualBasic.FirstDayOfWeek.Sunday) = 6 Then
                kw = kw + 1
            End If
            Dim CurrDateFirstDay As Date = DateAdd(DateInterval.Day, 1, ReturnDateForWeekNumber(kw))
            For i = 1 To 7


                strCurrDay = FormatDateTime(CurrDateFirstDay, DateFormat.LongDate)

........
我的问题是我的代码从2013年1月16日开始,最后一个日期是下周的2013年1月22日星期四。为什么呢?为什么他从2013年1月16日星期三开始,而不是从2013年1月14日星期一开始?为什么我会得到下周的返回日期?我做错了什么

编辑:

ReturnDateForWeekNumber:

Public Shared Function ReturnDateForWeekNumber(ByVal iWeek As Integer) As DateTime
    Return DateAdd(DateInterval.WeekOfYear, iWeek - 1, FirstDayOfYear)
End Function
我做错了什么

您应该在调试器中逐步检查代码并观察结果,就像我所做的那样:

Dim kw As Integer = DatePart(DateInterval.WeekOfYear, Now, , FirstWeekOfYear.FirstFourDays)
这将返回当前的一周,即第3周

If DatePart(DateInterval.Weekday, Now, Microsoft.VisualBasic.FirstDayOfWeek.Sunday) = 6 Then
    kw = kw + 1
End If
检查工作日是否为一周中的第六天(星期五)。我们不是星期五,所以如果不输入条件

Dim CurrDateFirstDay As Date = DateAdd(DateInterval.Day, 1, ReturnDateForWeekNumber(kw))
这会在ReturnDateForWeekNumber的结果上增加一天,返回:

Return DateAdd(DateInterval.WeekOfYear, iWeek - 1, FirstDayOfYear)
这将在一年的第一天(1月1日)即星期二的基础上增加2周(第3周减去1周)。1月1日+2周=1月15日

现在请记住,您为ReturnDateForWeekNumber添加了一天,这就是为什么
CurrDateFirstDay
的值为1月16日

编辑

我认为您的代码过于复杂,并且使用了很多旧的VB6函数。我会这样做:

Dim myDate As Date = DateTime.Today
Dim dayDiff As Integer = myDate.DayOfWeek - DayOfWeek.Monday
Dim currentDay As Date = myDate.AddDays(-dayDiff) 'Monday

For i = 1 to 7
    Console.WriteLine(currentDay)
    'Do something with current day
    currentDay = currentDay.AddDays(1)
Next
您可能需要对您的案例进行一些调整,但我相信这种方法更简单,更不容易出错

    Dim dateStartDateOfWeek As Date = GetWeekStartDate(52, 2014)
    Dim dateEndDateOfWeek As Date = DateAdd(DateInterval.Day, 7, dateStartDateOfWeek)

Private Function GetWeekStartDate(ByVal weekNumber As Integer, ByVal year As Integer) As Date
    Dim startDate As New DateTime(year, 1, 1)
    Dim weekDate As DateTime = DateAdd(DateInterval.WeekOfYear, weekNumber - 1, startDate)
    Return DateAdd(DateInterval.Day, (-weekDate.DayOfWeek) + 1, weekDate)
End Function
我做错了什么

您应该在调试器中逐步检查代码并观察结果,就像我所做的那样:

Dim kw As Integer = DatePart(DateInterval.WeekOfYear, Now, , FirstWeekOfYear.FirstFourDays)
这将返回当前的一周,即第3周

If DatePart(DateInterval.Weekday, Now, Microsoft.VisualBasic.FirstDayOfWeek.Sunday) = 6 Then
    kw = kw + 1
End If
检查工作日是否为一周中的第六天(星期五)。我们不是星期五,所以如果不输入条件

Dim CurrDateFirstDay As Date = DateAdd(DateInterval.Day, 1, ReturnDateForWeekNumber(kw))
这会在ReturnDateForWeekNumber的结果上增加一天,返回:

Return DateAdd(DateInterval.WeekOfYear, iWeek - 1, FirstDayOfYear)
这将在一年的第一天(1月1日)即星期二的基础上增加2周(第3周减去1周)。1月1日+2周=1月15日

现在请记住,您为ReturnDateForWeekNumber添加了一天,这就是为什么
CurrDateFirstDay
的值为1月16日

编辑

我认为您的代码过于复杂,并且使用了很多旧的VB6函数。我会这样做:

Dim myDate As Date = DateTime.Today
Dim dayDiff As Integer = myDate.DayOfWeek - DayOfWeek.Monday
Dim currentDay As Date = myDate.AddDays(-dayDiff) 'Monday

For i = 1 to 7
    Console.WriteLine(currentDay)
    'Do something with current day
    currentDay = currentDay.AddDays(1)
Next

您可能需要对您的案例进行一些调整,但我相信这种方法更简单,更不容易出错。

您可以发布
ReturnDateForWeekNumber
的代码吗?您可以发布
ReturnDateForWeekNumber
的代码吗?@Paks:是的,它在2012年有效,因为2012年的第一天是周日。2013年它失败了,因为它没有;-)那么,我该如何解决这个问题,使它在未来几年也能起作用呢?@Paks:是的,它在2012年也能起作用,因为2012年的第一天是星期天。2013年它失败了,因为它没有;-)那么,我该如何解决它,使它在未来几年也能起作用呢?
    Dim dateStartDateOfWeek As Date = GetWeekStartDate(52, 2014)
    Dim dateEndDateOfWeek As Date = DateAdd(DateInterval.Day, 7, dateStartDateOfWeek)

Private Function GetWeekStartDate(ByVal weekNumber As Integer, ByVal year As Integer) As Date
    Dim startDate As New DateTime(year, 1, 1)
    Dim weekDate As DateTime = DateAdd(DateInterval.WeekOfYear, weekNumber - 1, startDate)
    Return DateAdd(DateInterval.Day, (-weekDate.DayOfWeek) + 1, weekDate)
End Function