日期范围列表 VB.Net 或 C# 中的可能日期范围
Possible date ranges from a list of date range VB.Net or C#
我想从数据范围列表中获取可能的日期范围。
例如:
- 低于日期范围(开始日期、结束日期)
2021-01-01 00:00:00、2021-01-13 23:59:59
2021-01-07 00:00:00、2021-02-03 23:59:59
将输出如下3个列表
2021-01-01 00:00:00、2021-01-06 23:59:59
2021-01-07 00:00:00、2021-01-13 23:59:59
2021-01-14 00:00:00、2021-02-03 23:59:59
- 低于日期范围(开始日期、结束日期)
2021-01-01 00:00:00、2021-01-13 23:59:59
2021-01-02 00:00:00、2021-01-03 23:59:59
将输出如下3个列表
2021-01-01 00:00:00, 2021-01-01 23:59:59
2021-01-02 00:00:00、2021-01-03 23:59:59
2021-01-04 00:00:00、2021-01-13 23:59:59
- 列表中的 2 个日期范围(开始日期、结束日期)以下
2021-01-10 00:00:00、2021-01-30 23:59:59
2021-02-13 00:00:00、2021-02-26 23:59:59
如果没有重叠,将输出相同的 2 条记录。
我尝试的是,我得到了每个列表项的开始日期和结束日期。
然后对其进行排序,然后在列表中创建一个新的日期列表元组,其中第一个和第二个
Dim lstDateRanges As New List(Of Tuple(Of Date, Date))
Dim lstDates As New List(Of Date)
Dim lstNewDateRanges As New List(Of Tuple(Of Date, Date))
lstDateRanges.Add(Tuple.Create(CDate("2021-01-01 00:00:00"), CDate("2021-01-13 23:59:59")))
lstDateRanges.Add(Tuple.Create(CDate("2021-01-02 00:00:00"), CDate("2021-01-03 23:59:59")))
For Each dDate In lstDateRanges
lstDates.Add(dDate.Item1)
lstDates.Add(dDate.Item2)
Next
lstDates.Sort()
For i As Int32 = 0 To lstDates.Count - 2
If lstDates(i) <> lstDates(i + 1) Then 'ignore the same starting and ending dates
lstNewDateRanges.Add(Tuple.Create(lstDates(i), lstDates(i + 1).Date.AddSeconds(-1)))
End If
Next
虽然这不能正常工作。我觉得我的做法不对。
任何帮助将不胜感激。
Dim lstDateRanges As New List(Of Tuple(Of Date, Date))
Dim lstDates As New List(Of Date)
Dim lstNewDateRanges As New List(Of Tuple(Of Date, Date))
lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-13")))
lstDateRanges.Add(Tuple.Create(CDate("2021-01-02"), CDate("2021-01-03")))
'2nd test scenario
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-13")))
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-07"), CDate("2021-02-03")))
'3nd test scenario
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-13")))
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-15"), CDate("2021-02-03")))
'4nd test scenario
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-07")))
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-15")))
For Each dDate In lstDateRanges
lstDates.Add(dDate.Item1)
lstDates.Add(dDate.Item2)
Next
lstDates.Sort()
For i As Int32 = 0 To lstDates.Count - 2
If lstDates(i) <> lstDates(i + 1) Then 'ignore the same starting and ending dates
lstNewDateRanges.Add(Tuple.Create(lstDates(i).Date, lstDates(i + 1).Date.AddDays(1).AddSeconds(-1)))
End If
Next
For Each newRange In lstNewDateRanges.ToList
Dim bOverlapAny = False
For Each oldRange In lstDateRanges
If DoDateRangesOverlap(newRange.Item1.Date.AddSeconds(1), newRange.Item2.Date.AddSeconds(-1), oldRange.Item1.Date, oldRange.Item2.Date) Then
bOverlapAny = True
Exit For
End If
Next
If Not bOverlapAny Then lstNewDateRanges.Remove(newRange)
Next
我想从数据范围列表中获取可能的日期范围。 例如:
- 低于日期范围(开始日期、结束日期)
2021-01-01 00:00:00、2021-01-13 23:59:59
2021-01-07 00:00:00、2021-02-03 23:59:59
将输出如下3个列表
2021-01-01 00:00:00、2021-01-06 23:59:59
2021-01-07 00:00:00、2021-01-13 23:59:59
2021-01-14 00:00:00、2021-02-03 23:59:59
- 低于日期范围(开始日期、结束日期)
2021-01-01 00:00:00、2021-01-13 23:59:59
2021-01-02 00:00:00、2021-01-03 23:59:59
将输出如下3个列表
2021-01-01 00:00:00, 2021-01-01 23:59:59
2021-01-02 00:00:00、2021-01-03 23:59:59
2021-01-04 00:00:00、2021-01-13 23:59:59
- 列表中的 2 个日期范围(开始日期、结束日期)以下
2021-01-10 00:00:00、2021-01-30 23:59:59
2021-02-13 00:00:00、2021-02-26 23:59:59
如果没有重叠,将输出相同的 2 条记录。
我尝试的是,我得到了每个列表项的开始日期和结束日期。 然后对其进行排序,然后在列表中创建一个新的日期列表元组,其中第一个和第二个
Dim lstDateRanges As New List(Of Tuple(Of Date, Date))
Dim lstDates As New List(Of Date)
Dim lstNewDateRanges As New List(Of Tuple(Of Date, Date))
lstDateRanges.Add(Tuple.Create(CDate("2021-01-01 00:00:00"), CDate("2021-01-13 23:59:59")))
lstDateRanges.Add(Tuple.Create(CDate("2021-01-02 00:00:00"), CDate("2021-01-03 23:59:59")))
For Each dDate In lstDateRanges
lstDates.Add(dDate.Item1)
lstDates.Add(dDate.Item2)
Next
lstDates.Sort()
For i As Int32 = 0 To lstDates.Count - 2
If lstDates(i) <> lstDates(i + 1) Then 'ignore the same starting and ending dates
lstNewDateRanges.Add(Tuple.Create(lstDates(i), lstDates(i + 1).Date.AddSeconds(-1)))
End If
Next
虽然这不能正常工作。我觉得我的做法不对。
任何帮助将不胜感激。
Dim lstDateRanges As New List(Of Tuple(Of Date, Date))
Dim lstDates As New List(Of Date)
Dim lstNewDateRanges As New List(Of Tuple(Of Date, Date))
lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-13")))
lstDateRanges.Add(Tuple.Create(CDate("2021-01-02"), CDate("2021-01-03")))
'2nd test scenario
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-13")))
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-07"), CDate("2021-02-03")))
'3nd test scenario
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-13")))
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-15"), CDate("2021-02-03")))
'4nd test scenario
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-07")))
'lstDateRanges.Add(Tuple.Create(CDate("2021-01-01"), CDate("2021-01-15")))
For Each dDate In lstDateRanges
lstDates.Add(dDate.Item1)
lstDates.Add(dDate.Item2)
Next
lstDates.Sort()
For i As Int32 = 0 To lstDates.Count - 2
If lstDates(i) <> lstDates(i + 1) Then 'ignore the same starting and ending dates
lstNewDateRanges.Add(Tuple.Create(lstDates(i).Date, lstDates(i + 1).Date.AddDays(1).AddSeconds(-1)))
End If
Next
For Each newRange In lstNewDateRanges.ToList
Dim bOverlapAny = False
For Each oldRange In lstDateRanges
If DoDateRangesOverlap(newRange.Item1.Date.AddSeconds(1), newRange.Item2.Date.AddSeconds(-1), oldRange.Item1.Date, oldRange.Item2.Date) Then
bOverlapAny = True
Exit For
End If
Next
If Not bOverlapAny Then lstNewDateRanges.Remove(newRange)
Next