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 日期是 Friday,则排除该日期:
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 - 给定一个日期,我怎样才能得到最后四个星期五的日期?的主要内容,如果未能解决你的问题,请参考以下文章
具有一个日期和三个不同值的数据框:我怎样才能得到中间的那个?