定义一个表示日期、时间的结构体,输入任意两个时间,计算两个时间的时间差(天、 小时、分钟、秒、ms)
同一转换成毫秒计算差值,然后再转成天、小时、分钟、秒、毫秒。
两个测试运行结果:
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
typedef struct _date
{
int year, mon, day;
int hour, min, sec;
int ms;
}Date;
//判断是否是闰年
int isleapyear(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return 1;
else
return 0;
}
//计算两个日期之间相差的毫秒数
long long cmp(Date d1, Date d2)
{
int mon[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
long long sec = 0;
long long n1 = 0, n2 = 0;
int i;
Date t;
if (d1.year > d2.year)
{
t = d1;
d1 = d2;
d2 = t;
}
if (isleapyear(d1.year))
mon[2] = 29;
//计算d1本年已经过了多少秒
for (i = 0; i < d1.mon; i++)
n1 += mon[i];
n1 = n1 * 24* 3600; //转成秒数
n1 = n1 + (d1.day - 1) * 24 * 3600 + d1.hour * 3600 + d1.min * 60 + d1.sec;
//转毫秒
n1 = n1 * 1000 + d1.ms;
//计算d2到d1的差值
for (i = d1.year; i < d2.year; i++)
{
if (isleapyear(i))
n2 += 366;
else
n2 += 365;
}
if (isleapyear(d2.year))
mon[2] = 29;
else
mon[2] = 28;
for (i = 0; i < d2.mon; i++)
{
n2 += mon[i];
}
n2 += d2.day - 1; //得到天数
n2 = n2 * 24 * 3600 + d2.hour * 3600 + d2.min * 60 + d2.sec; //得到秒数
//转毫秒
n2 = n2 * 1000 + d2.ms;
sec = n2 - n1;
return sec; //返回两者差的毫秒数
}
int main()
{
Date d1, d2;
long long s = 0;
int day, hour, min, sec, ms;
printf("请输入时间1的年 月 日 时 分 秒 毫秒:");
scanf("%d %d %d %d %d %d %d", &d1.year, &d1.mon, &d1.day, &d1.hour, &d1.min, &d1.sec,&d1.ms);
printf("请输入时间2的年 月 日 时 分 秒 毫秒:");
scanf("%d %d %d %d %d %d %d", &d2.year, &d2.mon, &d2.day, &d2.hour, &d2.min, &d2.sec,&d2.ms);
s = cmp(d1,d2);
ms = s % 1000; //毫秒数
s = s / 1000; //转成秒
//计算天
day = s / (24 * 3600);
s -= day * 24 * 3600;
//计算小时
hour = s / 3600;
s -= hour * 3600;
//计算分钟
min = s / 60;
s -= min * 60;
//计算秒
sec = s;
printf("两个时间的时间差:%d天%d小时%d分钟%d秒%dms", day, hour, min, sec, ms);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!