搜索
bottom↓
回复: 18

时间差計算

[复制链接]

出0入0汤圆

发表于 2019-3-11 23:57:02 | 显示全部楼层 |阅读模式
条件如下
//输入开始 年 月 日 时 分 秒,
//输入结束 年 月 日 时 分 秒
// 计算两个时间的时间差,结果转成秒数
用 C语言,方便提供例程吗

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入4汤圆

发表于 2019-3-12 00:06:10 | 显示全部楼层
使用C语言的 time库,里面有 年月日时分秒 与 秒数 的转换函数。

这里的秒数是以 1970年1月1日 00:00:00 为基准的。  

分别转换 开始 和 结束时间,在做减法。

出0入0汤圆

 楼主| 发表于 2019-3-12 09:02:32 | 显示全部楼层
本帖最后由 jxchen 于 2019-3-12 21:54 编辑

谢谢分享~~~
,我已发出了如何更改标题

出0入362汤圆

发表于 2019-3-12 09:18:47 | 显示全部楼层
在啥平台上?linux的话直接把两个时间都转成timestamp然后相减就行了。没有time库的话。。得自己实现一下timestamp了。

出0入0汤圆

发表于 2019-3-12 09:29:31 | 显示全部楼层
打卡拿分,楼主还没意识到莫大的提醒,标题依旧,再次提个醒

出0入4汤圆

发表于 2019-3-12 09:45:18 | 显示全部楼层
jxchen 发表于 2019-3-12 09:02
谢谢分享~~~
,我已发出了如何更改标题

点击编辑帖子,然后改标题。

出0入0汤圆

发表于 2019-3-12 09:50:36 | 显示全部楼层
直接把时间转换成linux时间戳,再相关即得时间差呀,相当简单,不一定得在linux平台,只要有time库就可以了。

出0入0汤圆

发表于 2019-3-12 09:51:46 | 显示全部楼层
tomzbj 发表于 2019-3-12 09:18
在啥平台上?linux的话直接把两个时间都转成timestamp然后相减就行了。没有time库的话。。得自己实现一下ti ...

不个定要在linux平台,只要有time库就可以转换。

出0入0汤圆

发表于 2019-3-12 10:06:10 | 显示全部楼层
帖个以前做万年历用的C代码: 计算距2000年1月1日的天数
int GetDayOf2000(int year, int month, int day)
{
        int d;
        int daysinfo[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
       
        year -= 2000;
        d = year * 365 + (year + 3) / 4 - (year + 99) / 100 + (year + 399) / 400;
       
        d += daysinfo[month - 1];
       
        if (month > 2 && (year % 4) == 0) d++;
       
        d += day - 1;
       
        return d;
}

出10入18汤圆

发表于 2019-3-12 10:14:53 | 显示全部楼层
都转成时间戳,然后做减法。

出0入0汤圆

发表于 2019-3-12 11:08:16 | 显示全部楼层
又是畢業設計嗎?

出250入8汤圆

发表于 2019-3-12 16:35:39 | 显示全部楼层
请搜时间戳的函数,然后计算。 我刚用了,贴一下:

#define SECOND_OF_DAY 3600*24
extern const uint8_t Cnst_Month_Tbl[12];
const uint8_t Cnst_Month_Tbl0[12]={31,28,31,30,31,30,31,31,30,31,30,31};

void GetDateTimeFromSecond(u32 lSec, _real_time *tTime)
{
        u16 i,j,iDay;
        u32 lDay=0,temp;
        lSec = lSec + 8*3600;//转换为北京时间
        temp=lSec;
        while(temp>SECOND_OF_DAY)
        {
                temp-=SECOND_OF_DAY;
                lDay++;
        }        
        ////lDay = lSec/SECOND_OF_DAY;  不支持除法 32位 ?? 20190227
        ////lSec = lSec%SECOND_OF_DAY;
        lSec=temp;
        i = 1970;
        while(lDay > 365)
        {
                if(((i%4==0)&&(i%100!=0)) || (i%400==0))//闰年
                        lDay -= 366;
                else
                        lDay -= 365;
                i++;
        }
        if((lDay == 365) && !(((i%4==0)&&(i%100!=0)) || (i%400==0)))
        {
                lDay -= 365;
                i++;
        }
        tTime->year = i;//年份
        for(j=0;j<12;j++)
        {
                if((j==1) && (((i%4==0)&&(i%100!=0)) || (i%400==0)))
                        iDay = 29;
                else
                        iDay = Cnst_Month_Tbl0[j];
                if(lDay >= iDay) lDay -= iDay;
                else
                        break;
        }
        tTime->month = j+1;
        tTime->day = lDay+1;
        tTime->hour = ((lSec / 3600))%24;
        tTime->min = (lSec % 3600) / 60;
        tTime->sec = (lSec % 3600) % 60;
}

出0入0汤圆

发表于 2019-3-12 18:34:44 | 显示全部楼层
本帖最后由 jxn98310 于 2019-3-12 18:38 编辑

转成UTC时间后,做减法
/*
** ===================================================================
**     Method      :  m2m_time_ToUtc (component ENV)
**
**     Description :
**         This method converts a time in m2mTime_t to UTC time.
**     Parameters  : const m2mTimePtr_t fptTime:
**     Returns     : UINT32: UTC time in seconds
** ===================================================================
*/
UINT32 m2m_time_ToUtc(const m2mTimePtr_t fptTime)
{
    m2mTime_t tm;

    (void)memcpy(&tm, fptTime, sizeof(m2mTime_t));

    if (0 >= (INT16) (tm.Month -= 2))                          /* 1..12 -> 11,12,1..10 */
    {
        tm.Month += 12;                                        /* Puts Feb last since it has leap day */
        tm.Year -= 1;
    }

    return (((
                 (UINT32) (tm.Year / 4 - tm.Year / 100U + tm.Year / 400 + 367 * tm.Month / 12 + tm.Day) +
                 (UINT32)tm.Year * 365 - 719499
             ) * 24 + tm.Hour                                  /* now have hours */
            ) * 60 + tm.Minute                                 /* now have minutes */
           ) * 60 + tm.Second - tm.TimeZone * 3600;            /* finally seconds */

}

出0入0汤圆

发表于 2019-3-12 19:16:25 来自手机 | 显示全部楼层
将两个年月日时分秒输入time库,算出两个unix秒,相减

出0入0汤圆

发表于 2019-3-12 19:39:26 | 显示全部楼层
c 的标准库里都有, 不要重复造轮子啦。  
mktime

出0入0汤圆

发表于 2019-3-12 20:05:46 | 显示全部楼层
mktime转换成时间戳后在计算。

出0入0汤圆

 楼主| 发表于 2019-3-12 21:46:21 | 显示全部楼层
armok 发表于 2019-3-12 00:02
“时间差計算 ”不是合格标题,违反版规11。如不修正,将被封锁ID。

请教要更改什么样标题才可以

出0入0汤圆

 楼主| 发表于 2019-3-12 21:52:25 | 显示全部楼层

RTC模块取得时间是年月日、时-分-秒格式,我想转换成一个总的秒计数,请问怎么实现?
Example:  2019 0415 1443 00
用C 语言

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-6 23:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表