如何判断某个时间点是否在某个时间范围内

时间:2022-06-26 17:19:49
比如:23:02:03,怎么知道是在22:00:00-08:00:00(第二天)
      09:12:03,怎么知道是在08:00:00-22:00:00 之间
请高手指教;
不想通过下面的方式来实现;
  dt1:=StrToTime( '23:02:03 ');
  if (dt1>StrToTime( '08:00:00 '))  and  (dt1<StrToTime( '22:00:00 '))  then
    showmessage('时间在08——22')
  else
  begin
    if (dt1>StrToTime( '22:00:00 '))   or  (dt1<StrToTime( '08:00:00 '))  then
      showmessage('时间在22——08');
  end

19 个解决方案

#1


Use DateUntis;
var 
  Hour : Word;
begin
  Hour := HourOf(dt1);  //得到小时
  然后
  if (Hour>=8) and (Hour<=23);
  .....

#2


补充一下,还要比较分钟和秒的话,MinuteOf,SecondOf,
或者干脆用DecodeTime

#3


procedure TForm1.Button1Click(Sender: TObject);
var
  dt1,dt2:TDateTime;
begin
  dt1:=StrToTime('23:02:03');
  dt2:=StrToTime('08:02:03');
  Case InOutTimeJudge(dt1,dt2) of
    1:showmessage('都在第一段');
    2:showmessage('都在第二段');
    3:showmessage('第一段进,第二段出');
    4:showmessage('第二段进,第一段出');
  end;
end;

Function TForm1.InOutTimeJudge(InDateT,OutDateT:TDateTime):Integer;
var
  sign:Integer;
begin
  sign:=TimeISJudge(InDateT);
  if TimeISJudge(InDateT)=TimeISJudge(OutDateT) then
  begin
    if sign=1 then Result:=1;   //二个时间都在第一段
    if sign=2 then Result:=2;   //二个时间都在第二段
  end
  else
  begin
    if sign=1 then Result:=3;  //第一段进,第二段出
    if sign=2 then Result:=4;  //第二段进,第一段出
  end;
end;

Function TForm1.TimeISJudge(DateT:TDateTime):Integer;
begin
  if (DateT>StrToTime( '08:00:00 '))  and  (DateT<StrToTime( '22:00:00 '))  then
    Result:=1
  else
  begin
    if (DateT>StrToTime( '22:00:00 '))   or  (DateT<StrToTime( '08:00:00 '))  then
      Result:=2;
  end
end;

#4


引用楼主 gdxg0762 的回复:
比如:23:02:03,怎么知道是在22:00:00-08:00:00(第二天)
  09:12:03,怎么知道是在08:00:00-22:00:00 之间
请高手指教;
不想通过下面的方式来实现;
  dt1:=StrToTime( '23:02:03 ');
  if (dt1>StrToTime( '08:00:00 ')) and (dt1<StrToTime( '22:00:0……



你这个方法好像是不行,22点到次日08点判断应该会有问题的,还要加条件进去

#5


不好意思,刚才引用错了

你这个方法好像是不行,22点到次日08点判断应该会有问题的,还要加条件进去

引用 1 楼 kiboisme 的回复:
Use DateUntis;
var 
  Hour : Word;
begin
  Hour := HourOf(dt1); //得到小时
  然后
  if (Hour>=8) and (Hour<=23);
  .....

#6


加条件就比较整数部分,及日期部分

#7


用Delphi的日期函数date()获得系统的日期,Delphi还有几个与日期有关的函数。

#8


除了LZ的 判断方法 还真不知道别的了
一起等待答案

#9


加上日期吧,否则很别扭

#10


换个角度思考,
要证明时间点在时间断的范围内,
其实也就是判断时间点不在范围外.
钟表都是圆形的.
你只要证明他不在外边,那就是在里边了.

#11


日期时间本来就是浮点型的,次日的你索性,就加上24.00.然后判断数字大小.

#12


使用完整的时间,即:日期+时间。如:211-06-27 Am 4:21:00

#13


其实还是用的StrToDateTime的方式

#14


参考下这个吧

select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004

select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004

select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004

select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004

select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004

select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004

select CONVERT(varchar(12) , getdate(), 108 )
11:06:08

select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1

select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004

select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1

select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177

用这个语句就可取到日期
select CONVERT(varchar(12) , 你的日期字段, 108 )  as 时间段
11:06:08

  ‘08:00:00’<=时间段>=‘12:59:59’

#15


时间  实际上是一个 Double 
时间字符串转换成 时间类型直接 比较就行了。。

#16


引用 15 楼 vividw 的回复:
时间 实际上是一个 Double 
时间字符串转换成 时间类型直接 比较就行了。。


嗯,比较小数就行了,但要经过小时、天转换计算。

#17


日期型本来就可以比较大小的吧??

#18


晕倒。。。。。。

还要搞到SQL中去

你太牛了

引用 14 楼 babydog01 的回复:
参考下这个吧

SQL code

    select CONVERT(varchar(12) , getdate(), 101 )
    09/12/2004

    select CONVERT(varchar(12) , getdate(), 103 )
    12/09/2004

    select CONVERT(varchar(12) , getdate……

#19


最后还是按照自己的算法来做,谢谢大家!

#1


Use DateUntis;
var 
  Hour : Word;
begin
  Hour := HourOf(dt1);  //得到小时
  然后
  if (Hour>=8) and (Hour<=23);
  .....

#2


补充一下,还要比较分钟和秒的话,MinuteOf,SecondOf,
或者干脆用DecodeTime

#3


procedure TForm1.Button1Click(Sender: TObject);
var
  dt1,dt2:TDateTime;
begin
  dt1:=StrToTime('23:02:03');
  dt2:=StrToTime('08:02:03');
  Case InOutTimeJudge(dt1,dt2) of
    1:showmessage('都在第一段');
    2:showmessage('都在第二段');
    3:showmessage('第一段进,第二段出');
    4:showmessage('第二段进,第一段出');
  end;
end;

Function TForm1.InOutTimeJudge(InDateT,OutDateT:TDateTime):Integer;
var
  sign:Integer;
begin
  sign:=TimeISJudge(InDateT);
  if TimeISJudge(InDateT)=TimeISJudge(OutDateT) then
  begin
    if sign=1 then Result:=1;   //二个时间都在第一段
    if sign=2 then Result:=2;   //二个时间都在第二段
  end
  else
  begin
    if sign=1 then Result:=3;  //第一段进,第二段出
    if sign=2 then Result:=4;  //第二段进,第一段出
  end;
end;

Function TForm1.TimeISJudge(DateT:TDateTime):Integer;
begin
  if (DateT>StrToTime( '08:00:00 '))  and  (DateT<StrToTime( '22:00:00 '))  then
    Result:=1
  else
  begin
    if (DateT>StrToTime( '22:00:00 '))   or  (DateT<StrToTime( '08:00:00 '))  then
      Result:=2;
  end
end;

#4


引用楼主 gdxg0762 的回复:
比如:23:02:03,怎么知道是在22:00:00-08:00:00(第二天)
  09:12:03,怎么知道是在08:00:00-22:00:00 之间
请高手指教;
不想通过下面的方式来实现;
  dt1:=StrToTime( '23:02:03 ');
  if (dt1>StrToTime( '08:00:00 ')) and (dt1<StrToTime( '22:00:0……



你这个方法好像是不行,22点到次日08点判断应该会有问题的,还要加条件进去

#5


不好意思,刚才引用错了

你这个方法好像是不行,22点到次日08点判断应该会有问题的,还要加条件进去

引用 1 楼 kiboisme 的回复:
Use DateUntis;
var 
  Hour : Word;
begin
  Hour := HourOf(dt1); //得到小时
  然后
  if (Hour>=8) and (Hour<=23);
  .....

#6


加条件就比较整数部分,及日期部分

#7


用Delphi的日期函数date()获得系统的日期,Delphi还有几个与日期有关的函数。

#8


除了LZ的 判断方法 还真不知道别的了
一起等待答案

#9


加上日期吧,否则很别扭

#10


换个角度思考,
要证明时间点在时间断的范围内,
其实也就是判断时间点不在范围外.
钟表都是圆形的.
你只要证明他不在外边,那就是在里边了.

#11


日期时间本来就是浮点型的,次日的你索性,就加上24.00.然后判断数字大小.

#12


使用完整的时间,即:日期+时间。如:211-06-27 Am 4:21:00

#13


其实还是用的StrToDateTime的方式

#14


参考下这个吧

select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004

select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004

select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004

select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004

select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004

select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004

select CONVERT(varchar(12) , getdate(), 108 )
11:06:08

select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1

select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004

select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1

select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177

用这个语句就可取到日期
select CONVERT(varchar(12) , 你的日期字段, 108 )  as 时间段
11:06:08

  ‘08:00:00’<=时间段>=‘12:59:59’

#15


时间  实际上是一个 Double 
时间字符串转换成 时间类型直接 比较就行了。。

#16


引用 15 楼 vividw 的回复:
时间 实际上是一个 Double 
时间字符串转换成 时间类型直接 比较就行了。。


嗯,比较小数就行了,但要经过小时、天转换计算。

#17


日期型本来就可以比较大小的吧??

#18


晕倒。。。。。。

还要搞到SQL中去

你太牛了

引用 14 楼 babydog01 的回复:
参考下这个吧

SQL code

    select CONVERT(varchar(12) , getdate(), 101 )
    09/12/2004

    select CONVERT(varchar(12) , getdate(), 103 )
    12/09/2004

    select CONVERT(varchar(12) , getdate……

#19


最后还是按照自己的算法来做,谢谢大家!

#20