把年月日转换为指定时间的秒数函数已经实现,需要的朋友可参考:
/*
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#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 <stdio.h>
#include <time.h>
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)。