【问题标题】:VB.NET Get dates for following weekVB.NET 获取下一周的日期
【发布时间】:2016-04-13 07:00:27
【问题描述】:

我已使用以下代码来确定下一周的每一天的日期:

    Dim someDate As DateTime = Date.Today 

    Dim nextMonday As DateTime = someDate
    While nextMonday.DayOfWeek <> DayOfWeek.Monday
        nextMonday = nextMonday.AddDays(1)
    End While

    Dim nextTuesday As DateTime = someDate
    While nextTuesday.DayOfWeek <> DayOfWeek.Tuesday
        nextTuesday = nextTuesday.AddDays(1)
    End While

它工作得很好,除了未来的一天与今天相同。例如。今天是 2016 年 8 月 1 日星期五,代码也返回 2016 年 8 月 1 日,实际上它应该返回 2016 年 1 月 15 日。其他日子的所有日期都是正确的。 有什么想法吗?

问候

【问题讨论】:

  • 您可以在今天添加 1 天,让您的周期从第二天开始(当然这意味着搜索 11/1/2016 星期一返回 18/1/2016。这可以接受吗?
  • 谢谢史蒂夫。这对我有用。

标签: .net vb.net date dayofweek


【解决方案1】:

您可以使用以下扩展方法:

<System.Runtime.CompilerServices.Extension()> _
Public Function StartOfWeek(dt As DateTime, firstDayOfWeek As DayOfWeek) As DateTime
    Dim diff As Int32 = dt.DayOfWeek - firstDayOfWeek
    If diff < 0 Then
        diff += 7
    End If

    Return dt.AddDays(-1 * diff).Date
End Function

如果你想在下周完成List(Of Date)

Dim startOfNextWeek As Date = Date.Today.AddDays(7).StartOfWeek(DayOfWeek.Monday)
Dim nextWeek = Enumerable.Range(0, 7).Select(Function(d) startOfNextWeek.AddDays(d)).ToList()

没有 LINQ 也一样:

Dim nextWeek As New List(Of Date)
For d As Int32 = 0 To 6
    nextWeek.Add(startOfNextWeek.AddDays(d))
Next

【讨论】:

    【解决方案2】:

    使用循环值的函数会更好。这样的事情应该做你想做的事:

    Public Function FindNextDayOfWeek(startDate As Date, dayToFind As DayOfWeek) As Date
        Dim adjustment = 6 + (dayToFind - startDate.DayOfWeek)
        If adjustment > 7 Then adjustment -= 7
        Return startDate.AddDays(adjustment)
    End Function
    

    测试:

    FindNextDayOfWeek(#2015-01-13#, DayOfWeek.Tuesday) 'returns 19/01/2015
    FindNextDayOfWeek(#2015-01-11#, DayOfWeek.Wednesday) ' returns 13/01/2015
    FindNextDayOfWeek(#2015-01-11#, DayOfWeek.Monday) 'returns 18/01/2015
    

    【讨论】:

    • 如果dayToFindstartDate.DayOfWeek 之后,则此方法不起作用
    • 另外,你有神奇的数字。你应该让它们成为常量
    • 嗯,是的,但它们与一周中的天数有关,不太可能很快改变。
    • 当然,但这不是制作常量的唯一原因。这也是为了清楚地说明它们的含义。
    • 另外,它是DRY-er。我知道这不太可能,但如果你弄乱了 7 中的一个,你必须记住改变其他 7。
    【解决方案3】:

    这个方法应该适合你:

    Private Function GetNextDayOfWeek(afterDate As Date, targetDayOfWeek As DayOfWeek) As DateTime
        Const TotalDaysInWeek = DayOfWeek.Saturday - DayOfWeek.Sunday + 1 '+1 to account for zero indexed.
        Dim daysToAdd As Integer
    
        Select Case targetDayOfWeek
            Case Is < afterDate.DayOfWeek
                daysToAdd = afterDate.DayOfWeek - targetDayOfWeek - 1
            Case Is = afterDate.DayOfWeek
                daysToAdd = TotalDaysInWeek 'need to find exactly one week from "afterDate"
            Case Is > afterDate.DayOfWeek
                daysToAdd = targetDayOfWeek - afterDate.DayOfWeek
        End Select
    
        Return afterDate.AddDays(daysToAdd)
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      相关资源
      最近更新 更多