簡體   English   中英

將日期范圍拆分為幾個特定的​​日期范圍塊

[英]Split date range into several specific date range chunks

我有具有特定值的定期日期范圍列表:

14.09.2012 - 31.12.2015 = 8.25
01.01.2016 - 13.06.2016 = 11.00
14.06.2016 - 18.09.2016 = 10.50
19.09.2016 - 26.03.2017 = 10.00
27.03.2017 - 01.05.2017 = 9.75
02.05.2017 - 18.06.2017 = 9.25
19.06.2017 - 17.09.2017 = 9.00
18.09.2017 - 29.10.2017 = 8.50
30.10.2017 - 17.12.2017 = 8.25
18.12.2017 - 11.02.2018 = 7.75
12.02.2018 - 25.03.2018 = 7.50
26.03.2018 - 16.09.2018 = 7.25
17.09.2018 - NOW = 7.50

我正在尋找一種方法,考慮到系數值,將一個輸入數據范圍划分為上述數據范圍。

例如,如果我有輸入日期范圍01.01.2016 - 09.02.2016 ,我需要得到一個輸出日期范圍和系數:

01.01.2016 - 13.06.2016 = 11.00

但是如果我輸入日期范圍01.01.2016 - 29.04.2017 ,我需要獲得以下范圍和系數:

14.09.2012 - 31.12.2015 = 8.25 
01.01.2016 - 13.06.2016 = 11.00 
14.06.2016 - 18.09.2016 = 10.50 
19.09.2016 - 26.03.2017 = 10.00
27.03.2017 - 01.05.2017 = 9.75

輸出數據類:

public class OutputItem 
{

    public OutputItem()
    {

    }

    public DateTime Start { get; set; } = new DateTime();

    public DateTime End { get; set; } = new DateTime();

    public double Coeff { get; set; } = 0;
}

我嘗試獲取輸出數據的方法

    private List<OutputItem> GetOutput(DateTime start, DateTime end, List<OutputItem> specificRanges)
    {
        List<OutputItem> periods = new List<OutputItem>();

        foreach (OutputItem sr in specificRanges)
        {
            if (start >= sr.Start && sr.End <= end)
            {
                periods.Add(new OutputItem { Start = sr.Start, End = sr.End, Coeff = sr.Coeff });
            }
        }

        return periods;
    }

因此,我將在這里大膽假設,在您的第二個示例中,開始日期應該在01-01-2016之前 - 因為如果我理解這個問題,您希望返回與您傳遞給方法的開始到結束時間。
如果情況確實如此,那么您很接近 - 但您的情況是錯誤的。
測試兩個范圍是否重疊的方法是檢查一個范圍是否在另一端之前開始,反之亦然,如您在標簽的維基中所見:

當兩個或多個元素部分或全部相互覆蓋時,它們會重疊。 查找元素是否重疊的方法是測試一個元素是否在第二個結束之前開始,而第二個在第一個結束之前開始。

所以你的方法應該是:

private List<OutputItem> GetOutput(DateTime start, DateTime end, List<OutputItem> specificRanges)
{
    List<OutputItem> periods = new List<OutputItem>();

    foreach (OutputItem sr in specificRanges)
    {
        if (start >= sr.End && sr.Start <= end)
        {
            periods.Add(new OutputItem { Start = sr.Start, End = sr.End, Coeff = sr.Coeff });
        }
    }

    return periods;
}

暫無
暫無

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

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