【问题标题】:Getting Dates of Current week does not work as expected获取本周的日期不能按预期工作
【发布时间】:2015-02-25 17:48:39
【问题描述】:

我正在尝试获取当前周的日期(周一 - 周日)。

这是我当前的代码:

    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)

........

我的问题是我的代码从 16.01.2013 开始,最后日期是下周的 22.01.2013 星期四。这是为什么?为什么他从 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

【问题讨论】:

  • 你能把ReturnDateForWeekNumber的代码贴出来吗?

标签: vb.net datetime


【解决方案1】:

我做错了什么?

您应该像我一样在调试器中单步执行您的代码并观察结果:

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

这会检查工作日是否是一周中的第 6 天(星期五)。我们不是星期五所以如果没有输入条件。

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

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

【讨论】:

  • @Paks:是的,它适用于 2012 年,因为 2012 年的第一天正好是星期天。它在 2013 年失败了,因为它没有;-)
  • 那么我该如何解决它,以便它在未来几年也可以使用?
【解决方案2】:
    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

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2015-06-26
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多