VB.NET - 给定一个日期,我怎样才能得到最后四个星期五的日期?

Posted

技术标签:

【中文标题】VB.NET - 给定一个日期,我怎样才能得到最后四个星期五的日期?【英文标题】:VB.NET - Given a date, how can I get the date of last four fridays? 【发布时间】:2015-07-22 09:28:35 【问题描述】:

给定今天的日期想要获取过去四个星期的每个星期五的日期。

【问题讨论】:

如果今天是星期五,是否包括在内? Tim Schmelter - 是的,如果今天是星期五,它会捡起来的。但是如果你在 while 循环 "currentDate = currentDate.AddDays(-3)" 上面添加它,它不会选择本周的星期五。 【参考方案1】:

这是一个简单的 LINQ 方法:

Dim today = Date.Today
Dim lastFridays = From d In Enumerable.Range(0, Int32.MaxValue)
                  Let dt = today.AddDays(-d)
                  Where dt.DayOfWeek = DayOfWeek.Friday
                  Select dt
Dim lastFourFridays As Date() = lastFridays.Take(4).ToArray()

由于这不是最有效的方法,这里有一个仍然可读和可维护的查询,但只在第一个星期五搜索,然后每 7 天才需要一次:

Dim lastFriday = lastFridays.First()  ' reuse of above query '
Dim fridays = From d In Enumerable.Range(0, Int32.MaxValue)
              Let dt = lastFriday.AddDays(-d * 7)
              Select dt
Dim lastFourFridays As Date() = fridays.Take(4).ToArray()

【讨论】:

在找到四个星期五之前,查看前一天似乎不是很有效率。只是一个意见。 @dbasnett:这只是一个从 0 到 34 的循环(最多)。不要低估现代 CPU 的能力。所以在这不是一场表演比赛之前,我选择了最易维护和可读的方法。 我的第一台计算机 IBM 1620 让今天的 CPU 速度惊人。然而,我经常看到效率低下的小问题,当它们加在一起时,就会变得很大。你是正确的。 @dbasnett:好的,我添加了另一种保持可读性但更高效的 LINQ 方法。 可读性取决于读者,你不同意吗?你和我都明白......从可读性/维护的角度来看,其他答案是相同的,除了我的。我的可能需要更详细地解释数学,尽管我可能认为只有六个案例可以尝试。我会假设如果您需要基于每 5 秒随机开始日期的前四个星期五的 100 万个,您不会使用 LINQ。【参考方案2】:

您可以使用这个,它会返回一个此类日期的列表,如果 specifiedDate 日期是 Frid​​ay,则排除该日期:

Public Shared Function GetLastFourFridays(specifiedDate As DateTime) As List(Of DateTime)
    Dim dtm As New List(Of DateTime)()
    Dim dt As DateTime = specifiedDate
    For i As Integer = 0 To 6
        dt = dt.AddDays(-1)
        If dt.DayOfWeek = DayOfWeek.Friday Then
            dtm.Add(dt)
            Exit For
        End If
    Next
    dtm.Add(dt.AddDays(-7))
    dtm.Add(dt.AddDays(-14))
    dtm.Add(dt.AddDays(-21))

    Return dtm
End Function

而你的使用方式是:

Dim dtm As List(Of DateTime) = GetLastFourFridays(DateTime.Now)

For Each d As var In dtm
    Console.WriteLine(String.Format("Date: 0, Day: 1", d.ToString(), [Enum].Parse(GetType(DayOfWeek), d.DayOfWeek.ToString())))
Next

【讨论】:

【参考方案3】:

这是我的方式:

Function Last4Friday(ByVal StartDate As Date) As array
    Dim L4F()
    Dim mDate as date = StartDate
    For value As Integer = 1 To 7
        mDate = mDate.AddDays(-1)
        If mDate.DayOfWeek = DayOfWeek.Friday Then
        L4F = mDate, mDate.AddDays(-7), mDate.AddDays(-14), mDate.AddDays(-21)
        exit for
    End If
    Next
Return L4F

End Function

编辑:如果您需要检查插入的日期并且希望它在数组中返回,您可以简单地使用:

Dim mDate as date = StartDate.AddDays(1)

而不是

Dim mDate as date = StartDate

【讨论】:

【参考方案4】:

试试这个。它不使用循环来查找开始的星期五。

        Dim someDate As DateTime = DateTime.Now

        If someDate.DayOfWeek <> DayOfWeek.Friday Then
            'do the math to get a Friday
            someDate = someDate.AddDays(DayOfWeek.Friday - someDate.AddDays(1).DayOfWeek - 6)
        End If

        Dim last4Fridays As New List(Of DateTime) From someDate, someDate.AddDays(-7), someDate.AddDays(-14), someDate.AddDays(-21)

所有其他建议都使用循环来查找开始的星期五。如果不经常使用此代码,那么如何确定开始的星期五可能无关紧要。

编辑:作为函数

Function FindLastFourFridays(someDate As DateTime) As List(Of DateTime)
    'Find first Friday to include
    If someDate.DayOfWeek <> DayOfWeek.Friday Then
        someDate = someDate.AddDays(DayOfWeek.Friday - someDate.AddDays(1).DayOfWeek - 6)

        ' uncomment these two lines if you do not want initial someDate.DayOfWeek = DayOfWeek.Friday to be included
        'Else 
        '    someDate = someDate.AddDays(-7)
    End If
    'build the return (four fridays)
    Dim last4Fridays As New List(Of DateTime) From someDate, someDate.AddDays(-7), someDate.AddDays(-14), someDate.AddDays(-21)
    Return last4Fridays
End Function

【讨论】:

我的代码的执行时间似乎相同(在 .net fiddle 上测试),但我喜欢你的公式 @genespos - 我们的返回类型不同。如果您将它们设为相同的返回类型并选择 2015 年 7 月 23 日作为日期,它们将如何比较?【参考方案5】:

这个函数不需要传递一个日期,它选取今天的日期并获取从今天开始的最后四个星期五。它可以更改为一周中的任何一天。

    Dim todaysDate As Date = Date.Today
    Dim oldDay As Integer
    Dim thisWeek As Date

    Dim firstWeek As Date
    Dim secondWeek As Date
    Dim thirdWeek As Date
    Dim fourthWeek As Date


    'finds the Friday of the end of the current week No mattter what day you are working

    Dim daycount As Integer
    'use this to check specific dates "Dim datetime As New DateTime(2015, 4, 13)"
    oldDay = Weekday(todaysDate)
    thisWeek = todaysDate

    If oldDay < 6 Then
        daycount = 6 - oldDay
        thisWeek = thisWeek.AddDays(+daycount)
    ElseIf oldDay > 6 Then
        daycount = oldDay - 6
        thisWeek = thisWeek.AddDays(-daycount)
    End If

    Dim currentDate As Date = Now
    Do While Not currentDate.DayOfWeek = DayOfWeek.Friday
        currentDate = currentDate.AddDays(-1)
    Loop

    fourthWeek = currentDate.AddDays(-21)
    thirdWeek = currentDate.AddDays(-14)
    secondWeek = currentDate.AddDays(-7)
    firstWeek = currentDate

【讨论】:

以上是关于VB.NET - 给定一个日期,我怎样才能得到最后四个星期五的日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VB.Net 自定义 Excel

具有一个日期和三个不同值的数据框:我怎样才能得到中间的那个?

如何在 vb.net 中获取两个日期之间的记录?

在 VB.NET 中获取文件修改日期

在 vb.net winforms 中使用日期时间选择器保存日期时间时面临的问题

vb.net中如何获得某个窗口的句柄