2016-10-18 266 views
1

我很難想出一個乾淨的解決方案,並解決以下問題。 我需要根據每月分辨率在時間間隔(日期從/日期到)之間找到給定日期的索引。查找日期時間間隔索引

例子:

date format = yyyy-MM-dd 
timeIntervalFrom = 2016-02-01 
timeIntervalTo = 2017-03-01 
searchDate = 2017-01-01 

這裏,指數爲11

我想出的唯一事情是蠻力搜索,但我覺得有通過解決這個問題一個更清潔的方式一些數學。

var index = 0; 
while (timeIntervalFrom < timeIntervalTo) 
{ 
    if (timeIntervalFrom == searchDate) 
     break; 

    index++; 
    timeIntervalFrom = timeIntervalFrom.AddMonths(1); 
} 

任何建議將不勝感激!

編輯:

這裏是一個編譯溶液,其示出了使用@Pikoh溶液停止正常工作時的時間間隔越寬,由於具有不同長度個月,因此這不是一個可行的解決方案。

using System; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int endYear = 2022; 

      var index1 = FindIndex1(new DateTime(2016, 1, 1), new DateTime(endYear, 3, 1), new DateTime(endYear, 2, 1)); 
      var index2 = FindIndex2(new DateTime(2016, 1, 1), new DateTime(endYear, 3, 1), new DateTime(endYear, 2, 1)); 

      Console.Out.WriteLine($"FindIndex1: {index1}, FindIndex2: {index2}, Result: {(index1 == index2 ? "OK" : "FAIL")}"); 
     } 

     private static int FindIndex1(DateTime timeIntervalFrom, DateTime timeIntervalTo, DateTime searchDate) 
     { 
      var index = 0; 
      while (timeIntervalFrom < timeIntervalTo) 
      { 
       if (timeIntervalFrom == searchDate) 
        break; 

       index++; 
       timeIntervalFrom = timeIntervalFrom.AddMonths(1); 
      } 

      return index; 
     } 

     private static int FindIndex2(DateTime timeIntervalFrom, DateTime timeIntervalTo, DateTime searchDate) 
     { 
      return (searchDate - timeIntervalFrom).Days/30; 
     } 
    } 
} 

EDIT2:

我設法找到正確的解決方案閱讀提供的鏈接@Charles馬傑了。所以在某種程度上@Pikoh非常接近。非常感謝你們!

private static int FindIndex3(DateTime timeIntervalFrom, DateTime searchDate) 
{ 
    return (int) (searchDate.Subtract(timeIntervalFrom).Days/(365.2425/12)); 
} 
+2

這聽起來很像[差異月兩個日期之間(http://stackoverflow.com/questions/4638993/difference-in-months-between -two-dates)與'searchDate.Subtract(timeIntervalFrom)'。 –

+0

指數是指從日期起的月數?如果是這樣,嘗試'var index =(searchDate - timeIntervalFrom).Days/30;' – Pikoh

+0

我不明白你爲什麼有三個值。你在示例中不使用'searchDate' – LordWilmore

回答

0

試試下面的代碼:

private static int FindIndex(DateTime timeIntervalFrom, DateTime timeIntervalTo, DateTime searchDate) 
    { 

     var index = -1; 
     if (searchDate.CompareTo(timeIntervalFrom) >= 0 && searchDate.CompareTo(timeIntervalTo) <= 0) 
     { 
      index = (searchDate.Year - timeIntervalFrom.Year) * 12 
       + (searchDate.Month > timeIntervalFrom.Month ? searchDate.Month - timeIntervalFrom.Month 
       : searchDate.Month + 12 - timeIntervalFrom.Month); 
     } 

     return index; 
    }