嵌入式Linux实现夏令时,嵌入式 把年月日转换为当前系统的秒数

把年月日转换为指定时间的秒数函数已经实现,需要的朋友可参考:

/*

Author : kj

Function :

analyze the char string of time ,and

transform time mode to total seconds

Time : 2013-12-07 14:36

Instruction :

run the flow order

./ymd_to_seconds $1 $2

Notice :

$1 and $2 is :

$1 = 2013;12;07;14;36

$2 = 2013;12;07;14;36

*/

#include

#include

#include

#include

#define TIME_DATA_MAX_SIZE 8

int get_current_time(char *buf)

{

struct tm *tmnow;

struct timeval tv;

gettimeofday(&tv,NULL);

tmnow = localtime(&tv.tv_sec);

sprintf(buf,"%04d-%02d-%02d %02d:%02d:%02d",tmnow->tm_year+1900, tmnow->tm_mon+1, tmnow->tm_mday,tmnow->tm_hour,tmnow->tm_min, tmnow->tm_sec);

return tv.tv_sec;

}

int analyze_separator_num(char *src,int src_length)

{

char *cp_tmp;

char *src_temp = NULL;

char *src_temp_free = NULL;

int counter = 0;

src_temp = (char *)malloc((src_length+4)*sizeof(char));

strcpy(src_temp,src);

src_temp_free = src_temp;

cp_tmp = strtok(src_temp, ":");

if(cp_tmp)

{

#ifdef _DEBUG_KJ

printf("%s\n",cp_tmp);

#else

#endif

counter++;

}

while((cp_tmp=strtok(NULL,":"))!=NULL)

{

counter++;

#ifdef _DEBUG_KJ

printf("%s\n",cp_tmp);

#else

#endif

}

#ifdef _DEBUG_KJ

printf("%s %d The string is %s !The num strtok of ':' are %d\n",__FUNCTION__,__LINE__,src,counter-1);

#else

#endif

src_temp = src_temp_free;

free(src_temp);

src_temp = NULL;

src_temp_free = NULL;

return counter;

}

void analyze_socket_data(char *dest,char *src)

{

char *cp_tmp;

int counter = 0;

int i = 1;

cp_tmp = strtok(src, ":");

if(cp_tmp)

{

strcpy(dest,cp_tmp);

#ifdef _DEBUG_KJ

printf("dest is %s\n",dest);

#else

#endif

counter++;

}

while((cp_tmp=strtok(NULL,":"))!=NULL)

{

#ifdef _DEBUG_KJ

printf("the lenght of the cp_tmp is %d\n",strlen(cp_tmp));

printf("cp_tmp is %s \n",cp_tmp);

#else

#endif

memcpy((dest+i*TIME_DATA_MAX_SIZE),cp_tmp,strlen(cp_tmp));

strcpy(((dest+i*TIME_DATA_MAX_SIZE)+strlen(cp_tmp)),"\0");

counter++;

i++;

}

return;

}

int calculate_seconds(char in[6][8])

{

int total_seconds = 0;

struct tm tm_temp;

int year;

int mon;

int day;

int hour;

int min;

int sec;

#ifdef _DEBUG_KJ

year = atoi(in[0]);

mon = atoi(in[1]);

day = atoi(in[2]);

hour = atoi(in[3]);

min = atoi(in[4]);

sec = atoi(in[5]);

printf("%s %d The year is %d\n",__FUNCTION__,__LINE__,year);

printf("%s %d The mon is %d\n",__FUNCTION__,__LINE__,mon);

printf("%s %d The day is %d\n",__FUNCTION__,__LINE__,day);

printf("%s %d The hour is %d\n",__FUNCTION__,__LINE__,hour);

printf("%s %d The min is %d\n",__FUNCTION__,__LINE__,min);

printf("%s %d The sec is %d\n",__FUNCTION__,__LINE__,sec);

#else

#endif

tm_temp.tm_year = atoi(in[0]) - 1900;

tm_temp.tm_mon = atoi(in[1]) - 1;

tm_temp.tm_mday = atoi(in[2]);

tm_temp.tm_hour = atoi(in[3]);

tm_temp.tm_min = atoi(in[4]);

tm_temp.tm_sec = atoi(in[5]);

total_seconds = mktime(&tm_temp);

printf("%s %d The total of seconds is %d\n",__FUNCTION__,__LINE__,total_seconds);

return total_seconds;

}

int main(int argc,char *argv[])

{

struct tm joseph_tm;

int tm_begin_separator_num = 0;

int tm_end_separator_num = 0;

int i_temp = 0;

int tm_begin_seconds = 0;

int tm_end_seconds = 0;

int current_seconds = 0;

int the_seconds_of_record = 0;

char current_time[128] = {0};

memset(current_time,0,128);

current_seconds = get_current_time(current_time);

printf("%s %d The current time is %s , The total seconds is %d!\n",__FUNCTION__,__LINE__,current_time,current_seconds);

if(argc != 3)

{

printf("%s %d The param must be two ,please !\n",__FUNCTION__,__LINE__);

return -1;

}

if((strlen(argv[1]) != 20) || (strlen(argv[2]) != 20))

{

printf("%s %d The length of param must be 20 ,please !\n",__FUNCTION__,__LINE__);

return -1;

}

for(i_temp = 1; i_temp < argc;i_temp++)

{

printf("%s %d The %dth content is %s \n",__FUNCTION__,__LINE__,i_temp,argv[i_temp]);

}

tm_begin_separator_num = analyze_separator_num(argv[1],strlen(argv[1]));

tm_end_separator_num = analyze_separator_num(argv[2],strlen(argv[2]));

char tm_begin_temp_buf[tm_begin_separator_num][TIME_DATA_MAX_SIZE];

char tm_end_temp_buf[tm_end_separator_num][TIME_DATA_MAX_SIZE];

analyze_socket_data(tm_begin_temp_buf[0],argv[1]);

analyze_socket_data(tm_end_temp_buf[0],argv[2]);

#ifdef _DEBUG_KJ

for(i_temp = 0; i_temp < tm_begin_separator_num;i_temp++)

{

printf("%s %d The %dth content is %s \n",__FUNCTION__,__LINE__,i_temp,tm_begin_temp_buf[i_temp]);

}

for(i_temp = 0; i_temp < tm_end_separator_num;i_temp++)

{

printf("%s %d The %dth content is %s \n",__FUNCTION__,__LINE__,i_temp,tm_end_temp_buf[i_temp]);

}

#else

#endif

tm_begin_seconds = calculate_seconds(tm_begin_temp_buf);

tm_end_seconds = calculate_seconds(tm_end_temp_buf);

the_seconds_of_record = tm_end_seconds - tm_begin_seconds;

printf("%s %d The begin seconds is %d,The end seconds is %d ,The length of record video is %d\n",__FUNCTION__,__LINE__,tm_begin_seconds,tm_end_seconds,the_seconds_of_record);

return 0;

}

在我Linux上运行测试结果如下:

root@u12d32:/home/kongjun/work/hi_test/year_month_day_tosecond# ./ymd_to_second 2013:12:08:17:31:00: 2014:12:08:14:40:12:

main 160 The current time is 2013-12-08 17:40:59 , The total seconds is 1386495659!

main 174 The 1th content is 2013:12:08:17:31:00:

main 174 The 2th content is 2014:12:08:14:40:12:

calculate_seconds 142 The total of seconds is 1386495060

calculate_seconds 142 The total of seconds is 1418020812

main 198 The begin seconds is 1386495060,The end seconds is 1418020812 ,The length of record video is 31525752

下面是关于时间的小常识:

#include

#include

int main(void)

{

time_t timep;

struct tm *p;

time(&timep);

printf("time() : %d \n",timep);

p=localtime(&timep);

timep = mktime(p);

printf("time()->localtime()->mktime():%d\n",timep);

return 0;

}

struct tm小常识:

#ifndef _TM_DEFINED

struct tm {

int tm_sec; /* 秒–取值区间为[0,59] */

int tm_min; /* 分 - 取值区间为[0,59] */

int tm_hour; /* 时 - 取值区间为[0,23] */

int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */

int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */

int tm_year; /* 年份,其值从1900开始 */

int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */

int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */

int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/

long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/

const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/

};

#define _TM_DEFINED

#endif

ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值