我很难找到一个有以下问题的清洁解决方案。 我需要根据月度分辨率找到时间间隔(日期/日期)之间给定日期的索引。
示例:
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));
}
答案 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;
}