gpt4 book ai didi

arrays - 获取两个日期之间的所有特定日期 - 最快的方法?

转载 作者:行者123 更新时间:2023-12-02 22:17:32 25 4
gpt4 key购买 nike

我正在研究获取两个特定日期之间所有日期(周一、周二、周三)的最佳和最快方法。

日期以逗号分隔的字符串形式作为参数传递给网络服务,例如 mon,tue,wed,

目前这是伪代码。

所以我的(伪)代码如下

function Add(startdate, enddate, days)
{
dateList as New List(Of Date)
if days.split(',').count < 7 then
{
// This is the problem area.

}

while(startdate < enddate)
{
// do some processing of either the dates in dateList or just all days
}
}

这个问题对我来说是不是

1)

  • days参数拆分成一个数组,
  • 循环天数数组
  • 对于以天为单位的每个 day:
    • 遍历 startdateenddate 之间的每个日期
    • 如果 date.dayday,添加到 dateList在这种方法中,可能有 (365 * 6) 个检查(假设开始日期和结束日期相隔一年),如果选择了所有日期,我可以忽略将它们放入列表

2)

  • 遍历 startdateenddate 之间的每个日期
  • 开关(日期.dayofweek.tostring())
  • case 'mon':if days.contains('mon') then addDatetoList

3)

  • startdateenddate 之间的每个 everyday
  • 如果 days.contains(everyday.dayofweek.tostring()) 然后 addDatetoList

4) 有没有我忽略的另一种方法,所有这些方法都完全无效?

计算需要在 vb.net 代码隐藏中进行,否则我会考虑使用 sql server 来完成。

编辑

作为函数计时的练习,我快速构建了以下内容来尝试我的方法和其他方法。

Dim DaysOfWeek As String = "Monday,Tuesday,Friday"
Dim startDate As DateTime = DateTime.Now
Dim endDate As DateTime = DateTime.Now.AddDays(365)
Dim dateList As New List(Of DateTime)()

Dim method1StopWatch As New Stopwatch
Dim method2StopWatch As New Stopwatch
Dim method3StopWatch As New Stopwatch
Dim method4StopWatch As New Stopwatch

Dim executionStart As Long
Dim executionEnd As Long
Dim noDays As Integer = 0

'Method3

method3StopWatch.Start()
Do While (startDate < endDate)
If DaysOfWeek.Contains(startDate.DayOfWeek.ToString()) Then
dateList.Add(startDate)
noDays = noDays + 1
End If
startDate = startDate.AddDays(1)

Loop
method3StopWatch.Stop()
Label3.Text = method3StopWatch.ElapsedTicks.ToString() & " " & noDays & " Days"

noDays = 0
dateList.Clear()
startDate = DateTime.Now

'Method2

method2StopWatch.Start()

Do While (startDate < endDate)
Select startDate.DayOfWeek.ToString()
Case "Monday"
If DaysOfWeek.Contains("Monday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Tuesday"
If DaysOfWeek.Contains("Monday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Wednesday"
If DaysOfWeek.Contains("Wednesday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Thursday"
If DaysOfWeek.Contains("Thursday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Friday"
If DaysOfWeek.Contains("Friday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Saturday"
If DaysOfWeek.Contains("Saturday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
Case "Sunday"
If DaysOfWeek.Contains("Sunday") Then
dateList.Add(startDate)
noDays = noDays + 1
End If
End Select
startDate = startDate.AddDays(1)

Loop
method2StopWatch.Stop()
Label2.Text = (method2StopWatch.ElapsedTicks).ToString() & " " & noDays & " Days"

noDays = 0
dateList.Clear()
startDate = DateTime.Now

method1StopWatch.Start()
For Each Day As String In DaysOfWeek.Split(CChar(","))
Do While (startDate < endDate)
If startDate.DayOfWeek.ToString() = Day Then
noDays = noDays + 1
dateList.Add(startDate)
End If
startDate = startDate.AddDays(1)
Loop
startDate = DateTime.Now
Next


method1StopWatch.Stop()
Label1.Text = (method1StopWatch.ElapsedTicks).ToString() & " " & noDays & " Days"


noDays = 0
dateList.Clear()
startDate = DateTime.Now

method4StopWatch.Start()
Dim daysList As New List(Of DayOfWeek)()
daysList.Add(DayOfWeek.Monday)
daysList.Add(DayOfWeek.Tuesday)
daysList.Add(DayOfWeek.Friday)
Dim datesList As List(Of Date) = GetDayOfWeekDates(startDate, endDate, daysList)
method4StopWatch.Stop()
Label4.Text = (method4StopWatch.ElapsedTicks).ToString() & " " & datesList.Count & " Days"

End Sub

Public Function GetDayOfWeekDates(startDate As Date, endDate As Date, daysOfWeek As List(Of DayOfWeek)) As List(Of Date)
Dim liReturn As New List(Of Date)()
Dim currDay As Date = startDate
While currDay <= endDate
If daysOfWeek.Contains(currDay.Date.DayOfWeek) Then
liReturn.Add(currDay.Date)
End If
currDay = currDay.AddDays(1)
End While
Return liReturn
End Function

导致周一、周二、周五的以下输出(经过的滴答声):

Method 1 : 10650 - 157 Days
Method 2 : 4152 - 157 Days
Method 3 : 4084 - 157 Days
Method 4 : 179 - 157 Days

这也意味着我的方法和逻辑很差。

最佳答案

这就是我的做法。我不知道这是否是最高效的方式,但在我看来,这是最容易阅读和理解的代码,即使您检查的日期范围很大,也应该执行得相当快。

Public Function GetDayOfWeekDates(startDate As Date, endDate As Date, daysOfWeek As List(Of DayOfWeek)) As List(Of Date)
Dim liReturn As New List(Of Date)()
Dim currDay As Date = startDate
While currDay <= endDate
If daysOfWeek.Contains(currDay.Date.DayOfWeek) Then
liReturn.Add(currDay.Date)
End If
currDay = currDay.AddDays(1)
End While
Return liReturn
End Function

您可以通过构建要检查的 DayOfWeek 列表来调用该函数:

    Dim daysList As New List(Of DayOfWeek)()
daysList.Add(DayOfWeek.Monday)
daysList.Add(DayOfWeek.Friday)
Dim datesList As List(Of Date) = GetDayOfWeekDates(New Date(2012, 1, 1), New Date(2012, 12, 31), daysList)

在此示例中,您的结果将在 List(Of Date) datesList 中。

编辑:我刚刚注意到您提到网络服务将收到一个以逗号分隔的星期几列表。在我看来,您绝对应该在代码中的某个级别的单独函数中解析列表,如果列表无效,则可以通过 Web 服务返回错误。如上所示,查找日期列表的函数应采用强类型参数。

关于arrays - 获取两个日期之间的所有特定日期 - 最快的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com