在时间间隔中查找日期索引

时间:2016-10-18 08:12:03

标签: c# date datetime

我很难找到一个有以下问题的清洁解决方案。 我需要根据月度分辨率找到时间间隔(日期/日期)之间给定日期的索引。

示例:

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 Mager提供的链接。所以在某种程度上@Pikoh非常接近。非常感谢你们!

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

1 个答案:

答案 0 :(得分: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;
    }