打印
[STM32F1]

怎么判断一个时间点 在24小时的哪个时间段

[复制链接]
楼主: 电子过客
手机看帖
扫描二维码
随时随地手机跟帖
21
电子过客 发表于 2016-9-8 18:12
如果目前时间是2:01
时间段是1:02到3:03还是会false

什么意思,你不是吧24小时分四段?难道不是连续的4段么?

使用特权

评论回复
22
七颗咖啡豆| | 2016-9-8 23:41 | 只看该作者
请把问题描述清楚,不知道你想些什么。最好问题背景描述出来。二手信息又没表达好。

使用特权

评论回复
23
john_lee| | 2016-9-9 01:25 | 只看该作者
本帖最后由 john_lee 于 2016-9-9 01:33 编辑

大概给你写个一个例子,可以做到任意段顺序,简单起见时间粒度用的小时,你用分钟是类似的。
#include <cstdint>
#include <iostream>

struct seg_t {
  int start;
  int end;
};

const seg_t seg[4] = {
  { 8, 12 }, { 12, 18 }, { 18, 22 }, { 22, 8 }
};

int main ()
{
  int t;
  for (t = 0; t < 24; t++) {
    int i;
    for (i = 0; i < 4; i++) {
      int l = seg[i].end - seg[i].start;
      if (l < 0)
        l += 24;
      int t0 = t - seg[i].start;
      if (t0 < 0)
        t0 += 24;
      if (t0 < l)
        std::cout << t << ',' << i << std::endl;
    }
  }
  return 0;
}

每判断一个时间段用了3个比较,貌似应该不能再少了。

使用特权

评论回复
24
电子过客|  楼主 | 2016-9-9 08:38 | 只看该作者
七颗咖啡豆 发表于 2016-9-8 23:41
请把问题描述清楚,不知道你想些什么。最好问题背景描述出来。二手信息又没表达好。 ...

这是个大棚温室温度控制的环境环境, 根据在不同时间段的温度 进行 打开关闭通风窗的一个工作操作工人 根据植物的生长 设定对应的温度,
晚上工人下班, 白天才来上班的, 所有,0--24小时内, 根据不同的植物或生长周期, 分成的时间段是不一样的



11.png (25.66 KB )

11.png

使用特权

评论回复
25
ticomi| | 2016-9-9 08:43 | 只看该作者
可以参考PHP中的算法!

使用特权

评论回复
26
icecut| | 2016-9-9 09:22 | 只看该作者
先写个比较大小的函数.输出大还是小就行了.
然后依次比较前三个,最后一个不要比较.有一个成功了就得到属于哪个短.三个都不合适肯定在第四个段

使用特权

评论回复
27
datouyuan| | 2016-9-9 09:26 | 只看该作者
本帖最后由 datouyuan 于 2016-9-9 09:29 编辑
电子过客 发表于 2016-9-8 19:36
划分单位是分钟了,
某个时间点指点是的范围是在0-1440
但是

跨天的不是0~1440.
是0~240和1320~1440
想要连续的话是(240~1320)以外.

使用特权

评论回复
28
cos12a| | 2016-9-9 12:59 | 只看该作者
本帖最后由 cos12a 于 2016-9-9 13:03 编辑

从你的描述看:你这个题目只有0~24小时,不存在夸天,而且是循环执行。
从理论上讲,设置的四个时间段内的时间是不能重叠的。
从理论上讲,四个时间段在不连续的情况下,还缺少一个段外时间的默认值(温度)。
根据时间只会增加不会减少,只需要判断当前时间是否大于设置值即可。
根据上面的理论,排除不需要考虑的问题,只剩下:
程序要先比较时间是否进入段内,同时得到进入哪个段,然后比较当前时间是否出此段。再如循环。
程序出段后,未进入任一段,此时需要一个默认值作为补充。
程序如下:
进入段比较:
for(i=0;i<4;i++){
if(CurrentTime>SetTimeStart【i】) break;//进入。
)
出段比较:
if(CurrentTime>SetTimeEnd
【i】) break;//退出。

使用特权

评论回复
29
qwer0145| | 2016-9-9 13:37 | 只看该作者
我比较懵,条件或一下不就行了吗?
我哪里想错了?

使用特权

评论回复
30
lxyppc| | 2016-9-9 14:01 | 只看该作者
这玩意压根不需要快速
随随便便比较一下就好了
如果你的时间段很多,比如几十万个
可以先对时间段排序,这样你只要比较最先到的那个就行了

使用特权

评论回复
31
datouyuan| | 2016-9-9 14:11 | 只看该作者
电子过客 发表于 2016-9-8 16:18
void  OBJ_TEMP_TIME( void)

{
int timeComp(int begin,int end)
{
        if(end>begin)
        {//
                if( (Presenttemp_time>=begin) && (Presenttemp_time<end) )
                        return 1;
                else return 0;
        }
        else
        {//跨天
                if( (Presenttemp_time>=end) && (Presenttemp_time<begin) )
                        return 0;
                else return 1;
        }
}
时间判断函数,起始时间大于结束时间和起始时间小于结束时间的判断方法是不同的.

 if(timeComp(Objtemp_Begin_time1,Objtemp_End_time1))//判断是否在第一个时间段
        {
                Presenttemp_value= Objtemp_time1_temp;  usRegHoldingBuf[27]=Objtemp_time1_temp;     
        }
        else if(timeComp(Objtemp_Begin_time2,Objtemp_End_time2))//判断是否在第二个时间段
        {  
                Presenttemp_value=  Objtemp_time2_temp;  usRegHoldingBuf[27]= Objtemp_time2_temp;        
        }
        else if(timeComp(Objtemp_Begin_time3,Objtemp_End_time3))//判断是否在第三个时间段
        {  
                Presenttemp_value= Objtemp_time3_temp;   usRegHoldingBuf[27]=Objtemp_time3_temp;
        }
        else if(timeComp(Objtemp_Begin_time4,Objtemp_End_time4))//判断是否在第四个时间段
        //else//假如只有4个,不用判断第四个时间段
        {  
                Presenttemp_value= Objtemp_time4_temp;   usRegHoldingBuf[27]=Objtemp_time4_temp;   
        }
时间比较函数使用.


使用特权

评论回复
32
lgq1542380129| | 2016-9-9 16:32 | 只看该作者
个人认为:先找下规律:把楼主的四个时间段标记如下[8,12),[12,18),[18,22),[22,8),左闭右开的区间段,将区间左右端点除以六取整可得1,2,3,最后一个区间在[22,24)区间段为3,在24点为4,在[1,6)为0,在[6,8)为1,所以最后一个再这样判断不妥,直接比较为好(不小于22或小于8即在第四区间)。

使用特权

评论回复
33
datouyuan| | 2016-9-9 16:58 | 只看该作者
本帖最后由 datouyuan 于 2016-9-9 16:59 编辑
lgq1542380129 发表于 2016-9-9 16:32
个人认为:先找下规律:把楼主的四个时间段标记如下[8,12),[12,18),[18,22),[22,8),左闭右开的区间段, ...

[22,8)不就是[8,22)的相反部分吗.
请看31楼的函数.

楼主的这些时间参数只是举例,实际是可以任意设定的.

使用特权

评论回复
34
电子过客|  楼主 | 2016-9-9 17:53 | 只看该作者
datouyuan 发表于 2016-9-9 16:58
[22,8)不就是[8,22)的相反部分吗.
请看31楼的函数.

确实是举例子,时间是任意设定的,
不过 实际情况 我感觉 他们应该也是按照24小时来的, 还不确定

使用特权

评论回复
35
datouyuan| | 2016-9-9 17:57 | 只看该作者
电子过客 发表于 2016-9-9 17:53
确实是举例子,时间是任意设定的,
不过 实际情况 我感觉 他们应该也是按照24小时来的, 还不确定 ...

你还是看看我31楼的函数,应该能解决.
不管你这几个时间段是否重叠,随意输入参数,都有正确的判定结果.

使用特权

评论回复
36
lgq1542380129| | 2016-9-9 18:03 | 只看该作者
datouyuan 发表于 2016-9-9 16:58
[22,8)不就是[8,22)的相反部分吗.
请看31楼的函数.

我认为只要分段区间长度一致应该就可以使用该方法的。

使用特权

评论回复
37
datouyuan| | 2016-9-10 09:23 | 只看该作者
本帖最后由 datouyuan 于 2016-9-10 09:24 编辑
lgq1542380129 发表于 2016-9-9 18:03
我认为只要分段区间长度一致应该就可以使用该方法的。

你所说情形时间只会在4个区间中的一个.区间需要选0~3比1~4更合理.
不需要判断,只要一个表达式搞定.
( ( ( x+4 )  % 24 ) / 8 )
[22,8)区间值为0,不是4.

这表达式可以推广到n个分段区间一致的情形.n<=24,并且是偶数
( ( ( x+n/2 )  % 24 ) / n )

使用特权

评论回复
38
电子过客|  楼主 | 2016-9-28 09:15 | 只看该作者
本帖最后由 电子过客 于 2016-9-28 11:20 编辑
datouyuan 发表于 2016-9-9 14:11
时间判断函数,起始时间大于结束时间和起始时间小于结束时间的判断方法是不同的.

时间比较函数使用.

void  OBJ_TEMP_TIME( void)

{
              Objtemp_Begin_time1=Objtemp_Begin_th1*60+Objtemp_Begin_tm1;//变成一个参数
        
              Objtemp_End_time1=Objtemp_End_th1*60+Objtemp_End_tm1;
           
              Objtemp_Begin_time2=Objtemp_Begin_th2*60+Objtemp_Begin_tm2;//变成一个参数
        
              Objtemp_End_time2=Objtemp_End_th2*60+Objtemp_End_tm2;
        
              Objtemp_Begin_time3=Objtemp_Begin_th3*60+Objtemp_Begin_tm3;//变成一个参数
        
              Objtemp_End_time3=Objtemp_End_th3*60+Objtemp_End_tm3;
        
              Objtemp_Begin_time4=Objtemp_Begin_th4*60+Objtemp_Begin_tm4;//变成一个参数
        
              Objtemp_End_time4=Objtemp_End_th4*60+Objtemp_End_tm4;
        
              Presenttemp_time=timer.hour*60+timer.min;

        
             if(Objtemp_Begin_time1<Objtemp_End_time1)
        
                      {
                          if(Presenttemp_time>=Objtemp_Begin_time1&&Presenttemp_time<Objtemp_End_time1)//判断是否在第一个时间段
                                 
                                       {  Presenttemp_value= Objtemp_time1_temp;  usRegHoldingBuf[27]=Objtemp_time1_temp;  }
                     }
           else
                                 
                  {
                       if( (Presenttemp_time>=Objtemp_End_time1) && (Presenttemp_time<Objtemp_Begin_time1) )
                                    
                                    { Presenttemp_value= Objtemp_time1_temp;  usRegHoldingBuf[27]=Objtemp_time1_temp;  }
                                                                                                                                 
                 }
                                
         if(Objtemp_Begin_time2<Objtemp_End_time2)        
                                 
               {
                       if( Presenttemp_time>=Objtemp_Begin_time2&&Presenttemp_time<Objtemp_End_time2)//判断是否在第二个时间段
                  
                             {  Presenttemp_value=  Objtemp_time2_temp;  usRegHoldingBuf[27]= Objtemp_time2_temp;        }
                                                                          
                }
         else
                                 
                  {
                        if( (Presenttemp_time>=Objtemp_End_time2) && (Presenttemp_time<Objtemp_Begin_time2) )
                                    
                        {  Presenttemp_value=  Objtemp_time2_temp;  usRegHoldingBuf[27]= Objtemp_time2_temp;    }                        
                }
                                 
         if(Objtemp_Begin_time3<Objtemp_End_time3)        
                                 
               {

                    if( Presenttemp_time>=Objtemp_Begin_time3&&Presenttemp_time<Objtemp_End_time3)//判断是否在第三个时间段
                        
                         {  Presenttemp_value= Objtemp_time3_temp;   usRegHoldingBuf[27]=Objtemp_time3_temp; }

              }                        
        else                                       
                 {  

                     if( (Presenttemp_time>=Objtemp_End_time3) && (Presenttemp_time<Objtemp_Begin_time3) )

                        {  Presenttemp_value= Objtemp_time3_temp;   usRegHoldingBuf[27]=Objtemp_time3_temp;                        
                 }
                                
                                
         if(Objtemp_Begin_time4<Objtemp_End_time4)
                                         
            {
                                         
                     if( Presenttemp_time>=Objtemp_Begin_time4&&Presenttemp_time<Objtemp_End_time4)//判断是否在第四个时间段
                  
                    {  Presenttemp_value= Objtemp_time4_temp;   usRegHoldingBuf[27]=Objtemp_time4_temp;   }
                                                                          
           }
                                 
         else
                                         
          {   

               if( (Presenttemp_time>=Objtemp_End_time4) && (Presenttemp_time<Objtemp_Begin_time4) )
                  
                       {  Presenttemp_value= Objtemp_time4_temp;   usRegHoldingBuf[27]=Objtemp_time4_temp;   }
                                             
          }                                                        
}

实验这多半天感觉您的还是比较简单实用的, 只是多了几条判断


使用特权

评论回复
39
datouyuan| | 2016-9-28 09:41 | 只看该作者
本帖最后由 datouyuan 于 2016-9-28 09:44 编辑
电子过客 发表于 2016-9-28 09:15
void  OBJ_TEMP_TIME( void)

{
相比你以前的代码,只多了一次判断.(头和尾谁大)
怎么不用31楼的使用函数的方法.
难道你那是按代码行数计算编程工作量?

使用特权

评论回复
40
crystal1987| | 2016-9-28 09:48 | 只看该作者
这个问题,通过你们的讨论,瞬间感觉好高深。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则