簡體   English   中英

可能的日期范圍來自日期范圍 VB.Net 或 C# 的列表

[英]Possible date ranges from a list of date range VB.Net or C#

我想從數據范圍列表中獲取可能的日期范圍。 前任:

  1. 低於日期范圍(開始日期、結束日期)
    2021-01-01 00:00:00, 2021-01-13 23:59:59
    2021-01-07 00:00:00, 2021-02-03 23:59:59

將 output 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

  1. 低於日期范圍(開始日期、結束日期)
    2021-01-01 00:00:00, 2021-01-13 23:59:59
    2021-01-02 00:00:00, 2021-01-03 23:59:59

將 output 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

  1. 列表中低於 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

將 output 相同的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM