时间零点前后问题

本文探讨了如何处理灯控器中涉及跨零点时间段的时间判断问题,作者分享了两种思路,一种是通过转换中午12点为基准,另一种是针对时间段跨越零点的特殊情况进行判断。最后实现的`jud_inside`函数确保了在不同时间段内的灯控逻辑准确无误。
摘要由CSDN通过智能技术生成

        在做一个灯控器用时间来调节灯的亮度时,在时间上犯了难,问题所在是一个时间段内如果既包括零点前又包括零点后,那该如何判断?

        刚开始想了一个思路:把中午十二点当作一天的开始,时间都转化为距离中午12点的分钟数,以此来判断,其实这样来判断考虑到了中午12点前后用户不会在这个时间段内亮灯,但仅仅是把午夜12点的坎换到了中午12点,属于治标不治本。

//返回现在时间距离中午12点的分钟数
int time_trans_format(void)
{
    DirStru *getTime = (DirStru *)malloc(sizeof(DirStru));
    GetRTC(getTime);
    int minute = ((atoi(getTime->RTC_Time) / 100 + 12) % 24) * 60 + atoi(getTime->RTC_Time) % 100;
    free(getTime);
    return minute;
}
//时间控灯
void control_time(COMMOND_SOLOR_TIME timeBri)
{
    int nowTime=time_trans_format();  
    if(nowTime>=timeBri.time2&&nowTime<timeBri.time3)      //第三个时间段
    {
        control_bri(timeBri.bri2);
        ESP_LOGI(TAG, "%d:third time begin:%d  now:%d  end:%d",devInfo.policy,timeBri.time2,nowTime,timeBri.time3);
    }
    else if(nowTime>=timeBri.time1&&nowTime<timeBri.time2)   //第二个时间段
    {
        control_bri(timeBri.bri1);
        ESP_LOGI(TAG, "%d:second time begin:%d  now:%d  end:%d",devInfo.policy,timeBri.time1,nowTime,timeBri.time2);
    }
    else if(nowTime>=timeBri.time0&&nowTime<timeBri.time1)    //第一个时间段
    {
        control_bri(timeBri.bri0);
        ESP_LOGI(TAG, "%d:first time begin:%d  now:%d  end:%d",devInfo.policy,timeBri.time0,nowTime,timeBri.time1);
    }
    else
    {
        control_bri(0);
    }
}

        但用这种思路终归是存在不合理的,于是又换了一种思路:先判断时间段是否有跨越零点的情况,如果结束时间 < 开始时间,证明有跨越零点的时间段,对这种特殊情况特殊考虑,用一个流程图来说明这种关系:

//判断现在的时间是否在被控时间内
static int  jud_inside(int nowTime,int begTime,int endTime,char bri)
{
    //开始时间 > 结束时间,跨越了零点
    if(begTime>endTime)
    {
        //在零点前
        if(nowTime>=begTime)
        {
            control_bri(bri);
            return 1;
        }
        //在零点后
        if(nowTime<endTime)
        {
            control_bri(bri);
            return 1;
        }
        return 0;
    }
    //开始时间 < 结束时间, 没有跨越零点
    if(begTime<endTime)
    {
        if(nowTime>=begTime&&nowTime<endTime)
        {
            control_bri(bri);
            return 1;
        }
        return 0;
    }
    return 0;
}

//时间控灯
void control_time(COMMOND_SOLOR_TIME timeBri)
{
    int nowTime;
    //时间
    DirStru *RtcGet = (DirStru *)malloc(sizeof(DirStru));
    GetRTC(RtcGet);

    nowTime = atoi(RtcGet->RTC_Time);
    //先判断第一个时间段,在此区间,直接返回
    if(jud_inside(nowTime, timeBri.time0, timeBri.time1, timeBri.bri0)==1)
    {
        free(RtcGet);
        return;
    }
    //先判断第二个时间段,在此区间,直接返回
    if(jud_inside(nowTime, timeBri.time1, timeBri.time2, timeBri.bri1)==1)
    {
        free(RtcGet);
        return;
    }
    //先判断第三个时间段,在此区间,直接返回
    if(jud_inside(nowTime, timeBri.time2, timeBri.time3, timeBri.bri2)==1)
    {
        free(RtcGet);
        return;
    }
    control_bri(0);
    free(RtcGet);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

small_planet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值