說明:以下文中本人使用的是C#語言,且時間精度爲秒
有時候項目中會要求去判斷兩個時間是否是相等的,且是在誤差範圍內相等的,以下是本人項目中用到的算法,僅當做記事本而已,如有問題請指正,願意相互學習。
相關類中自定義方法
// function: 判斷兩個時間是否在允許誤差內相等
// params: 時間1、時間2、允許誤差
public bool isTimeEqual(DateTime CurTime, DateTime RecTime, ushort errorValue)
{
bool res = false;
int P_CmpRes = 0;
int P_dayTmp = 0;
DateTime P_TimerHead, P_TimerLast;
P_CmpRes = DateTime.Compare(CurTime, RecTime);
if (errorValue > 60)
return false;
if (errorValue == 0)
{
if (P_CmpRes == 0)
{
res = true;
}
else
{
res = false;
}
}
else
{
if (P_CmpRes == 0) // 判斷哪個時間在前
{
res = true;
}
else
{
if (P_CmpRes > 0)
{
P_TimerHead = CurTime;
P_TimerLast = RecTime;
}
else
{
P_TimerHead = RecTime;
P_TimerLast = CurTime;
}
// 時間不是嚴格相等但在誤差範圍內的一般情況
if (P_TimerHead.Year == P_TimerLast.Year) // 同年
{
if (P_TimerHead.Month == P_TimerLast.Month) // 同月
{
if (P_TimerHead.Day == P_TimerLast.Day) // 同日
{
if (P_TimerHead.Hour == P_TimerLast.Hour)
{
if (P_TimerHead.Minute == P_TimerLast.Minute) // 同分不同秒
{
if (P_TimerHead.Second - P_TimerLast.Second <= errorValue)
{
res = true;
}
else
{
res = false;
}
}
else // 不同分不同秒
{
if (P_TimerHead.Minute - P_TimerLast.Minute == 1)
{
if (P_TimerHead.Second + 60 - P_TimerLast.Second <= errorValue)
{
res = true;
}
else
{
res = false;
}
}
else
{
res = false;
}
}
}
else
{
if ((P_TimerHead.Hour - P_TimerLast.Hour == 1) && (P_TimerHead.Minute == 0) && (P_TimerLast.Minute == 59))
{
if (P_TimerHead.Second + 60 - P_TimerLast.Second <= errorValue)
{
res = true;
}
else
{
res = false;
}
}
else
{
res = false;
}
}
}
else // 不同日
{
if ((P_TimerHead.Day - P_TimerLast.Day == 1) && (P_TimerHead.Hour == 0) && (P_TimerHead.Minute == 0)
&& (P_TimerLast.Hour == 23) && (P_TimerLast.Minute == 59))
{
if (P_TimerHead.Second + 60 - P_TimerLast.Second <= errorValue)
{
res = true;
}
else
{
res = false;
}
}
else
{
res = false;
}
}
}
else // 不同月
{
if ((P_TimerHead.Month == 4) && (P_TimerHead.Month == 6) && (P_TimerHead.Month == 8) && (P_TimerHead.Month == 9) && (P_TimerHead.Month == 11))
{
P_dayTmp = 31;
}
else if (P_TimerHead.Month == 3)
{
if (P_TimerHead.Year % 4 == 0)
{
P_dayTmp = 29;
}
else
{
P_dayTmp = 28;
}
}
else
{
P_dayTmp = 30;
}
if ((P_TimerHead.Month - P_TimerLast.Month == 1) && (P_TimerHead.Day == 1) && (P_TimerHead.Hour == 0) && (P_TimerHead.Minute == 0)
&& (P_TimerLast.Day == P_dayTmp) && (P_TimerLast.Hour == 23) && (P_TimerLast.Minute == 59))
{
if (P_TimerHead.Second + 60 - P_TimerLast.Second <= errorValue)
{
res = true;
}
else
{
res = false;
}
}
else
{
res = false;
}
}
}
else // 不同年
{
if ((P_TimerHead.Year - P_TimerLast.Year == 1) && (P_TimerHead.Month == 1) && (P_TimerHead.Day == 1)
&& (P_TimerHead.Hour == 0) && (P_TimerHead.Minute == 0)
&& (P_TimerHead.Month == 12) && (P_TimerHead.Day == 31) && (P_TimerHead.Hour == 23) && (P_TimerHead.Minute == 59))
{
if (P_TimerHead.Second + 60 - P_TimerLast.Second <= errorValue)
{
res = true;
}
else
{
res = false;
}
}
else
{
res = false;
}
}
}
}
return res;
}