C# 查找时间间隔中的日期索引
对于以下问题,我很难想出一个干净的解决方案。 我需要根据每月的分辨率,在时间间隔(date from/date to)之间找到给定日期的索引C# 查找时间间隔中的日期索引,c#,date,datetime,C#,Date,Datetime,对于以下问题,我很难想出一个干净的解决方案。 我需要根据每月的分辨率,在时间间隔(date from/date to)之间找到给定日期的索引 using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { int endYear = 2022; var index1 = F
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;
}
}
}
例如:
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);
}
请尝试以下代码:
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;
}
private static int FindIndex(DateTime timeIntervalFrom、DateTime timeIntervalTo、DateTime searchDate)
{
var指数=-1;
如果(searchDate.CompareTo(timeIntervalFrom)>=0&&searchDate.CompareTo(timeIntervalTo)timeIntervalFrom.Month?searchDate.Month-timeIntervalFrom.Month
:searchDate.Month+12-timeIntervalFrom.Month);
}
收益指数;
}
尝试以下代码:
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;
}
private static int FindIndex(DateTime timeIntervalFrom、DateTime timeIntervalTo、DateTime searchDate)
{
var指数=-1;
如果(searchDate.CompareTo(timeIntervalFrom)>=0&&searchDate.CompareTo(timeIntervalTo)timeIntervalFrom.Month?searchDate.Month-timeIntervalFrom.Month
:searchDate.Month+12-timeIntervalFrom.Month);
}
收益指数;
}
听起来很像搜索日期。减去(timeIntervalFrom)。索引表示从日期算起的月数?如果是这样,请尝试var index=(searchDate-timeIntervalFrom).Days/30我不明白为什么你有三个值。您的示例中没有使用searchDate
,为什么您说我的解决方案不起作用?如果我的计算是正确的,从2016年1月到2022年3月有75个月……你认为正确的结果应该是什么?听起来很像searchDate。减去(timeIntervalFrom)
。Index表示从日期算起的月数?如果是这样,请尝试var index=(searchDate-timeIntervalFrom).Days/30我不明白为什么你有三个值。您的示例中没有使用searchDate
,为什么您说我的解决方案不起作用?如果我的计算是正确的,从2016年1月到2022年3月有75个月……你认为正确的结果应该是什么?