当时间落在时间范围之间时返回True?

时间:2011-02-10 11:26:49

标签: c#

我正在制作一个函数来检查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
}

5 个答案:

答案 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));
        }
    }