C语言计算两个时间之间的时间差,精确到秒。 现在我用的是time_t来计算的,但是我发现这个tim

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言计算两个时间之间的时间差,精确到秒。 现在我用的是time_t来计算的,但是我发现这个tim相关的知识,希望对你有一定的参考价值。

C语言计算两个时间之间的时间差,精确到秒。
现在我用的是time_t来计算的,但是我发现这个time_t计算的结果有问题,比如我想计算2016-02-29 06:00:00到2016-03-01 06:00:00之间的时间差,本来期望得到的结果是86400(也就是一天的时间差),可是程序返回给我的结果是259200(也就是整整三天的时间差),程序默认把2016年2月也计算为31天,这是错误的……
也不知道是我不会用time_t,还是怎么回事……
谁有更好的计算两个时间之间的时间差的方法,给推荐一下……

参考技术A 第一个时间相对于1900-01-01 00:00:00是多少秒
第二个时间相对于1900-01-01 00:00:00是多少秒
再相减就OK
参考技术B #include "stdio.h"
#include "time.h"
int main(void)
    struct tm d31=0,0,6,1,2,2016-1900,,d229=0,0,6,29,1,2016-1900,;
    time_t t=mktime(&d31)-mktime(&d229);
    printf("It is %ld\\n",t);
    return 0;

追问

你这种用法跟我用的一模一样。你计算的时间差是正确的?
不对吧?

追答

"一模一样"就应该没有问题!

追问

d31指的是2016年3月1号,d229指的是2016年2月29号?
那个结构体后面赋的值跟这个日期对不上啊……
那样的赋值啥意思?

追答

你不是说与你的“一模一样”嘛,怎么没有看懂?mktime函数需要一个struct tm型结构体变量做实参,返回一个time_t型长整型。d229和d31都被声明为struct tm型结构体变量,且在声明时同时分别初始化为2016年2月29日和2016年3月1日。如struct tm d31=0,0,6,1,2,2016-1900,;就是给结构体变量d31的秒成员、分成员、时成员、日成员、年成员依次赋了初值0、0、6、1、2(表示3月,这个成员的值域是0~11)、115(结构体年成员的值要求是1900年以来的年数);其余成员没有用上,就没有赋值……

参考技术C 转换为时间戳,进行计算。追问

怎么转换?

追答

// ttime->tm_year = 2016-1900;
// ttime->tm_mon = 4-1;
// ttime->tm_mday = 1;
// ttime->tm_hour = 10;
// ttime->tm_min = 52;
// ttime->tm_sec = 1;
// time_t ft=mktime(ttime);

本回答被提问者采纳
参考技术D 打这么多字 😇

c语言如何计算两个时间相差多少

比如我想计算5:34:30到19:33:34 这之间经过了多少小时多少分钟,多少秒。现在我只能把时间print出来,请问接下来要怎么来计算时间差呢
#include <stdio.h>
int main()

struct time
int hour;
int minute;
int second;
;
struct time t1,t2;
printf("please input the structure time1:");
scanf("%d %d %d",&t1.hour,&t1.minute,&t1.second);
printf("please input the structure time2:");
scanf("%d %d %d",&t2.hour,&t2.minute,&t2.second);
printf("t1=%d:%d:%d,t2=%d:%d:%d\n",t1.hour,t1.minute,t1.second,t2.hour,t2.minute,t2.second);

return 0;


多谢各位大神!

/**

time.c

定义一个结构体实现两个时间的加减

*/

#include<stdio.h>

#include<string.h>

typedef struct

int seconds;

int minutes;

int hours;

Time;

int checkTime(Time time);

void printTime(Time time);

void swap(Time *time1,Time *time2);//大的时间放在前面

Time subtract1(Time *first,Time *second);

Time subtract(Time *first,Time *second);//默认第一个时间比第二个大

int main()

Time time1;

Time time2;

Time time3;

char againch[5]="y";

while(strcmp(againch,"y")==0||strcmp(againch,"Y")==0)

 

int again=1;

while(again)

printf("输入时间1:");

scanf("%d:%d:%d",&time1.hours,&time1.minutes,&time1.seconds);

if(checkTime(time1))

printf("-----输入时间格式错误!请重新输入\\n");

again=1;

else

again=0;

again=1;

while(again)

printf("输入时间2:");

scanf("%d:%d:%d",&time2.hours,&time2.minutes,&time2.seconds);

if(checkTime(time2))

printf("-----输入时间格式错误!请重新输入\\n");

again=1;

else

again=0;

 

swap(&time1,&time2);

printf("           ");

printTime(time1);

printf(" - ");

printTime(time2);

time3=subtract(&time1,&time2);

printf(" = ");

printTime(time3);

printf("\\n");

printf("继续[y/n]?:");

scanf("%s",againch);

return 0;

//检查时间的格式

int checkTime(Time time)

//    printf("小时格式错误:%d\\n",(time.hours>=24||time.hours<0));

//    printf("分钟格式错误:%d\\n",(time.minutes>=60||time.minutes<0));

//    printf("秒格式错误  :%d\\n",(time.seconds>=60||time.minutes<0));

return ((time.hours>24||time.hours<0)||(time.minutes>=60||time.minutes<0)||(time.seconds>=60||time.minutes<0));

//输出按个数输出时间

void printTime(Time time)

printf("%d:%d:%d",time.hours,time.minutes,time.seconds);

//大的时间放到第一个变量,小的时间方法哦第二个变量

void swap(Time *time1,Time *time2)

//保证第一个时间永远大于第二个时间

if(time2->hours>time1->hours)//如果有time

//交换两个时间的小时

time2->hours^=time1->hours;

time1->hours^=time2->hours;

time2->hours^=time1->hours;

//交换两个时间的分钟:

time1->minutes^=time2->minutes;

time2->minutes^=time1->minutes;

time1->minutes^=time2->minutes;

//交换两个时间的秒:

time1->seconds^=time2->seconds;

time2->seconds^=time1->seconds;

time1->seconds^=time2->seconds;

else if(time2->minutes>time1->minutes&&time1->hours==time2->hours)

//交换两个时间的分钟:

time1->minutes^=time2->minutes;

time2->minutes^=time1->minutes;

time1->minutes^=time2->minutes;

//交换两个时间的秒:

time1->seconds^=time2->seconds;

time2->seconds^=time1->seconds;

time1->seconds^=time2->seconds;

else if(time2->seconds>time1->seconds&&time1->minutes==time2->minutes)

//交换两个时间的秒:

time1->seconds^=time2->seconds;

time2->seconds^=time1->seconds;

time1->seconds^=time2->seconds;

//计算两个时间的差

Time subtract(Time *first,Time *second)//默认第一个时间比第二个大

Time result;

//先对秒进行相减

if(first->seconds>=second->seconds)//如果第一个秒大于或者等于

result.seconds=first->seconds-second->seconds;

else//如果第一个的秒数小的话

first->minutes=first->minutes-1;//借位

first->seconds=first->seconds+60;

result.seconds=first->seconds-second->seconds;

//接着对分钟相减

if(first->minutes>=second->minutes)//如果第一个秒大于或者等于

result.minutes=first->minutes-second->minutes;

else//如果第一个的秒数小的话

first->hours=first->hours-1;//借位

first->minutes=first->minutes+60;

result.minutes=first->minutes-second->minutes;

//交换后 默认第一个小时会大于第一个,没有借位的情况,不用

result.hours=first->hours-second->hours;

return result;

拓展资料

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。



参考技术A

任意输入两个24小时制的时间,输出两个时间的时间差;

    return 0;

    //检查时间的格式

    int checkTime(Time time)

    //    printf("小时格式错误:%d\\n",(time.hours>=24||time.hours<0));

    //    printf("分钟格式错误:%d\\n",(time.minutes>=60||time.minutes<0));

    //    printf("秒格式错误  :%d\\n",(time.seconds>=60||time.minutes<0));

    return ((time.hours>24||time.hours<0)||(time.minutes>=60||time.minutes<0)||(time.seconds>=60||time.minutes<0));

    //输出按个数输出时间

    void printTime(Time time)

    printf("%d:%d:%d",time.hours,time.minutes,time.seconds);

    //大的时间放到第一个变量,小的时间方法哦第二个变量

    void swap(Time *time1,Time *time2)

    //保证第一个时间永远大于第二个时间

    if(time2->hours>time1->hours)//如果有time

    //交换两个时间的小时

    time2->hours^=time1->hours;

    time1->hours^=time2->hours;

    time2->hours^=time1->hours;

    //交换两个时间的分钟:

    time1->minutes^=time2->minutes;

    time2->minutes^=time1->minutes;

    time1->minutes^=time2->minutes;

    //交换两个时间的秒:

    time1->seconds^=time2->seconds;

    time2->seconds^=time1->seconds;

    time1->seconds^=time2->seconds;

    else if(time2->minutes>time1->minutes&&time1->hours==time2->hours)

测试:

参考技术B 主要可以通过两种方法实现,第一种直接计算,第二种通过difftime
函数实现,具体代码如下,
//函数功能计算两个时间差,未考虑时间数据有效性
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(int argc, char *argv[])

struct time1
int hour;
int minute;
int second;
;
struct time1 t1,t2;
struct tm *ptr1,*ptr2;
time_t lt;
time(<);//当前系统时间
ptr1=localtime(<);//返回指向当前时间的指针
ptr2=(struct tm *)malloc(sizeof(struct tm));//动态申请指针ptr2
memcpy(ptr2,ptr1,sizeof(struct tm));//复制ptr1
long diff=0;//存储时间差
//第一种方法,直接计算
printf("please input the structure time1:");
scanf("%d %d %d",&t1.hour,&t1.minute,&t1.second);
printf("please input the structure time2:");
scanf("%d %d %d",&t2.hour,&t2.minute,&t2.second);
printf("t1=%d:%d:%d,t2=%d:%d:%d\n",t1.hour,t1.minute,t1.second,t2.hour,t2.minute,t2.second);
diff=(t1.hour*3600+t1.minute*60+t1.second)-(t2.hour*3600+t2.minute*60+t2.second);
diff=(diff>0)?diff:(-1*diff);
printf("1. diff=%ld\n",diff);
//第二种方法,通过difftime计算
ptr1->tm_sec=t1.second;//更改当前时间为t1,struct tm结构其他成员不变
ptr1->tm_min=t1.minute;
ptr1->tm_hour=t1.hour;
ptr2->tm_sec=t2.second;//更改当前时间为t2
ptr2->tm_min=t2.minute;
ptr2->tm_hour=t2.hour;
diff=(long)difftime(mktime(ptr2),mktime(ptr1));
printf("2. diff=%ld\n",diff);
return 0;


double difftime( time_t time2, time_t time1 );函数返回时间参数time2和time1之差的秒数表示。
结构体tm定义如下,
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有关)*/
;
参考技术C 把t1和t2中间的时间全部折算成秒,然后使用秒数相减,最后折算回时分秒就行了。 参考技术D #include <stdio.h>

struct time

int hour;

int minute;

int second;

;

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

int sum1;

int sum2;

int sum;

struct time t1,t2;

printf("please input the structure time1:");

scanf("%d %d %d",&t1.hour,&t1.minute,&t1.second);

printf("please input the structure time2:");

scanf("%d %d %d",&t2.hour,&t2.minute,&t2.second);

printf("t1=%d:%d:%d,t2=%d:%d:%d\n",t1.hour,t1.minute,t1.second,t2.hour,t2.minute,t2.second);

sum1=(t1.hour)*60+(t1.minute)*60+t1.second;

sum2=(t2.hour)*60+(t2.minute)*60+t2.second;

sum=sum2-sum1;

if(sum<0)

sum=sum*(-1);

printf("%d",sum);

return 0;



printf("%d",sum);

本回答被提问者和网友采纳

以上是关于C语言计算两个时间之间的时间差,精确到秒。 现在我用的是time_t来计算的,但是我发现这个tim的主要内容,如果未能解决你的问题,请参考以下文章

如何通过excel计算时间差 精确到秒

sql求时间差,精确到秒分时

如何将GetTickCount得到的DWORD转化为时间,毫秒级

编写c++程序,当用户输入两个时刻(采用24小时制,精确到秒)之后,输出这两个时刻的时间差

SQL 获取两个日期相差几个月,要精确到日

C语言程序运行时间测试