我正在制作一个函数来检查24小时格式的时间范围之间的时间,但是我的代码有些问题,是否可以指出如何修复?
我的代码:
bool isDoTime(int starthour, int startminute, int endhour, int endminute)
{
TimeSpan start = new TimeSpan(starthour, startminute, 0);
TimeSpan end = new TimeSpan(endhour, endminute, 0);
TimeSpan add24h = new TimeSpan(24, 0, 0);
TimeSpan now = DateTime.Now.TimeOfDay;
if (starthour > endhour || (endhour == starthour && endminute <= startminute))
{
end += add24h;
}
if ((now > start) && (now < end))
{
return true;
}
return false;
}
问题:我希望在20:30 - 3:30之间的当前时间返回true,但是当我运行下面的代码时。条件仅在8:30到00:00之间返回true,而在00:00 - 3:30之间不是真的
if (isDoTime(20,30,3,30) //return true from 20:30 - 3:30
{
//dosomething
}
答案 0 :(得分:5)
如果它跨越午夜,则分成一张支票,并在同一天分开。
TimeSpan start = new TimeSpan(starthour, startminute, 0);
TimeSpan end = new TimeSpan(endhour, endminute, 0);
TimeSpan now = DateTime.Now.TimeOfDay;
//The readable version:
if(start>end){
//Must check if after start (before midnight) or before end (after midnight)
if((now > start) || (now < end)){
return true;
{
}
else
{
//Simple check - span is within same day
if ((now > start) && (now < end))
{
return true;
}
}
return false;
简短/神秘的版本:
return start > end ? (now > start) || (now < end) : (now > start) && (now < end);
答案 1 :(得分:3)
您希望使用DateTime
结构而不是整数。您还可以将其推广到仲裁日期时间。如果secondTime
小于firstTime
,则会向secondTime
添加1天。
public bool IsBetween(this DateTime thisTime, DateTime firstTime, DateTime secondTime) {
if (secondTime < firstTime)
secondTime = secondTime.AddDays(1);
return firstTime < thisTime && thisTime < secondTime);
}
// to use...
bool isDoTime = DateTime.Now.IsBetween(firstTime, secondTime);
答案 2 :(得分:1)
我认为你最好不要使用DateTime
,但是,如果开始时间大于结束时间,你仍然需要检查一下,在这种情况下增加24小时。
您的方法将开始:
bool isDoTime(int starthour, int startminute, int endhour, int endminute)
{
DateTime start = new DateTime(0, 0, 0, starthour, startminute, 0);
DateTime end = new DateTime(0, 0, 0, endhour, endminute, 0);
if (start > end)
{
end.AddDays(1);
}
DateTime now = DateTime.Now;
return start < now && now < end;
}
虽然您可能需要<=
测试,具体取决于您的逻辑
(除非你的逻辑是你在24小时内添加的地方 - 该代码是否执行?)
答案 3 :(得分:0)
在这里使用DateTime作为参数会更容易,并避免手动检查的整个问题:
bool isDoTime(DateTime starttime, DateTime endtime)
{
if (DateTime.Now > starttime && DateTime.Now < endtime)
{
return true;
}
return false;
}
答案 4 :(得分:0)
[TestFixture]
public class Class1
{
private DateTime _now;
[SetUp]
public void SetUp()
{
_now = DateTime.MinValue.AddDays(1).AddHours(2); //02.01.0001 02:00:00
}
[Test]
public void TestCase()
{
Assert.IsTrue(IsDoTime(20, 30, 3, 30));
}
bool IsDoTime(int starthour, int startminute, int endhour, int endminute)
{
var start1 = DateTime.MinValue.AddHours(starthour).AddMinutes(startminute); //01.01.0001 20:30:00
var end1 = endhour < starthour
? DateTime.MinValue.AddDays(1).AddHours(endhour).AddMinutes(endminute) //02.01.0001 03:30:00
: DateTime.MinValue.AddHours(endhour).AddMinutes(endminute);
return ((_now > start1) && (_now < end1));
}
}