编辑代码

#include <stdio.h>
#include <math.h>
#include <stdint.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include <stdlib.h> 

uint8_t  gCuc_HEX2BCDMap[] =
{
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,	//0-9
	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,	//10-19
	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,	//20-29
	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,	//30-39
	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,	//40-49
	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,	//50-59
	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,	//60-69
	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,	//70-79
	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,	//80-89
	0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,	//90-99
};
uint8_t APIByteHEX2BCD(uint8_t ucHEX)
{
    if(ucHEX > 99)
    {
        return 99;
    }
    return gCuc_HEX2BCDMap[ucHEX];
}
/*
计算两个时间间隔多少秒
参数:
char *datetime1		输入日期 YYYYMMDDHHMMSS
char *datetime2		输入日期 YYYYMMDDHHMMSS
单位秒
*/
long diff_datetime(char *datetime1, char *datetime2)
{
	time_t timep1=0, timep2=0;
	long d_tmp=0;
	struct tm tm1, tm2;
	char ctmp1[4+1]={0};
	char ctmp2[4+1]={0};
	int year1=0;
	int year2=0;
	int mon1 =0;
	int mon2 =0;
	int day1 =0;
	int day2 =0;
	int hour1=0;
	int hour2=0;
	int min1 =0;
	int min2 =0;
	int sec1 =0;
	int sec2 =0;
	memset(&tm1,0,sizeof(tm1));
	memset(&tm2,0,sizeof(tm2));
	memset(ctmp1,0,sizeof(ctmp1));
	memset(ctmp2,0,sizeof(ctmp2));

	memcpy(ctmp1,datetime1,4);
	memcpy(ctmp2,datetime2,4);
	year1 =atoi(ctmp1);
	year2 =atoi(ctmp2);

	memset(ctmp1,0,sizeof(ctmp1));
	memset(ctmp2,0,sizeof(ctmp2));
	memcpy(ctmp1,datetime1+4,2);
	memcpy(ctmp2,datetime2+4,2);
	mon1 =atoi(ctmp1);
	mon2 =atoi(ctmp2);

	memset(ctmp1,0,sizeof(ctmp1));
	memset(ctmp2,0,sizeof(ctmp2));
	memcpy(ctmp1,datetime1+6,2);
	memcpy(ctmp2,datetime2+6,2);
	day1 =atoi(ctmp1);
	day2 =atoi(ctmp2);

	memset(ctmp1,0,sizeof(ctmp1));
	memset(ctmp2,0,sizeof(ctmp2));
	memcpy(ctmp1,datetime1+8,2);
	memcpy(ctmp2,datetime2+8,2);
	hour1 =atoi(ctmp1);
	hour2 =atoi(ctmp2);

	memset(ctmp1,0,sizeof(ctmp1));
	memset(ctmp2,0,sizeof(ctmp2));
	memcpy(ctmp1,datetime1+10,2);
	memcpy(ctmp2,datetime2+10,2);
	min1 =atoi(ctmp1);
	min2 =atoi(ctmp2);

	memset(ctmp1,0,sizeof(ctmp1));
	memset(ctmp2,0,sizeof(ctmp2));
	memcpy(ctmp1,datetime1+12,2);
	memcpy(ctmp2,datetime2+12,2);
	sec1 =atoi(ctmp1);
	sec2 =atoi(ctmp2);

    tm1.tm_year=year1-1900;
    tm2.tm_year=year2-1900;

    tm1.tm_mon=mon1-1;
    tm2.tm_mon=mon2-1;

    tm1.tm_mday=day1;
    tm2.tm_mday=day2;

    tm1.tm_hour=hour1;
    tm2.tm_hour=hour2;


    tm1.tm_min=min1;
    tm2.tm_min=min2;

    tm1.tm_sec=sec1;
    tm2.tm_sec=sec2;

    timep1 = mktime(&tm1);	//传入时间
    timep2 = mktime(&tm2);	//传入时间
	d_tmp = timep2 - timep1;
	return d_tmp;
}

//计算到下一个时间是多少秒
// UpdataInterval:间隔多久上送
// UpDataTime: 24小时上送时,指定时间
// readDatetimeState:是否获取到日期时间状态
// uint8_t year,uint8_t month,uint8_t day,uint8_t hour,uint8_t minute,uint8_t second: 当前时间
uint32_t GetNextSec(uint8_t UpdataInterval,uint8_t UpDataTime,uint8_t readDatetimeState,uint8_t year,uint8_t month,uint8_t day,uint8_t hour,uint8_t minute,uint8_t second){
    uint8_t type_Number = 0;
    uint16_t    time_sec = 0;
    uint8_t     ServerTime[20] = {0};
    uint8_t     c_datetime[20] = {0};
    long        s_sec;
    long        s_sec1;


    if(UpdataInterval<1){
        UpdataInterval = 1;
    }

    if(UpDataTime == 0){
        UpDataTime = 24;
    }

  //  type_Number = Read_DLT645Type_Number();
    //按1小时上送一次来计算
    if(UpdataInterval == 1){        
        if(readDatetimeState == 1){
            sprintf((char *)ServerTime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,minute,second);
            sprintf((char *)c_datetime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,0,0);

            s_sec = diff_datetime((char *)c_datetime, (char *)ServerTime);      //时间差计算

            printf("1小时:s_sec = %d\r\n",s_sec);
    
            if(abs(s_sec)>3300){
                 return  (3600-abs(s_sec))+3600;
            }
            else{
                return  3600-abs(s_sec);
            }
        }
        else{
            return 3600;        //没有读到数据,1个小时后采集上送
        }
    }

    //按天算
    else if(UpdataInterval == 24){
        if(readDatetimeState == 1){
            sprintf((char *)ServerTime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,minute,second);
            sprintf((char *)c_datetime,"20%02X%02X%02X%02X%02X%02X",year,month,day,APIByteHEX2BCD(UpDataTime),0,0);

           s_sec = diff_datetime((char *)c_datetime, (char *)ServerTime);      //时间差计算

            printf("s_sec = %d\r\n",s_sec);

            //接近指定时间
            if(abs(s_sec) < 300){
                if(s_sec<0){     //没有到指定时间
                    return abs(s_sec) + 86400;
                }
                else{
                    return 86400-abs(s_sec);
                }
            }

            else{
                if(s_sec<0){     //没有到指定时间
                    return abs(s_sec);
                }
                else{
                    return 86400-abs(s_sec);
                }            
            }
       }
       else{
           return 86400;        //没有读到数据,1个小时后采集上送
       }
    }

    else{
        if(readDatetimeState == 1){

            sprintf((char *)ServerTime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,minute,second);
            sprintf((char *)c_datetime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,0,0);

           s_sec = diff_datetime((char *)c_datetime, (char *)ServerTime);      //时间差计算

           printf("s_sec = %d\r\n",s_sec);

            if(s_sec>3300){
               return (3600-(s_sec))+((UpdataInterval)*3600);
           }
           else{
               return (3600-(s_sec))+((UpdataInterval-1)*3600);
           }
       }
       else{
           return ((UpdataInterval)*3600);;        //没有读到数据,1个小时后采集上送
       }
    }
}


int main () {

    printf("sec = %d\r\n",GetNextSec(1,1,1,0x25,0x6,0x22,0x13,0x54,0x0));

    printf("sec = %d\r\n",GetNextSec(1,1,1,0x25,0x6,0x22,0x13,0x54,0x0));
}