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

关于#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 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。