dashidai_ 2023-01-01 12:12 采纳率: 94.1%
浏览 48
已结题

关于#c语言#的问题:定义一个表示日期、时间的结构体,输入任意两个时间,计算两个时间的时间差(天、 小时、分钟、秒、ms)

定义一个表示日期、时间的结构体,输入任意两个时间,计算两个时间的时间差(天、 小时、分钟、秒、ms)

  • 写回答

2条回答 默认 最新

  • 关注

    同一转换成毫秒计算差值,然后再转成天、小时、分钟、秒、毫秒。
    两个测试运行结果:

    img

    img

    代码:

    #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;
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 创建了问题 1月1日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么