野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9776|回复: 2

关于F103中时间戳函数的一个问题

[复制链接]
发表于 2019-1-17 14:52:46 | 显示全部楼层 |阅读模式
本帖最后由 若语海洋 于 2019-1-17 14:53 编辑

之前用野火霸道开发板的时候发现,日期设置为1月份,转出来的时间戳是负数,然后用DEVC++测试了一下逻辑,发现还是这个问题,在网上搜索了一波关于Linux mktime 的算法解析,输入的1月份在程序里是上一年的11月,2月份是上一年的12月,为什么月份设置为2转出来的时间戳不会有这种问题呢?
DEV中的代码如下,可直接测试逻辑。求各路大佬翻牌
#include <stdio.h>      /* printf, scanf */
#include <string.h>

unsigned int mktimev(unsigned char  DP[]);

unsigned int mktimev(unsigned char  DP[])
{
        unsigned int temp = 2000+DP[0];
        if (0 >= (int) (DP[1] -= 2)) {        /* 1..12 -> 11,12,1..10 */
                DP[1] += 12;                /* Puts Feb last since it has leap day */
                temp -= 1;
        }

        return (((
                (unsigned int) (temp/4 - temp/100 +temp/400 + 367*DP[1]/12 + DP[2]) +
                        temp*365 - 719499
            )*24 + DP[3] /* now have hours */
          )*60 + DP[4] /* now have minutes */
        )*60 + DP[5]; /* finally seconds */         
}



int main()
{
        unsigned int chuo;


unsigned char  DataPackg[7];
        DataPackg[0] = 18;
        DataPackg[1] = 1;
        DataPackg[2] = 7;
        DataPackg[3] = 16;
        DataPackg[4] = 9;
        DataPackg[5] = 12;
        DataPackg[6] = 20;
        chuo = mktimev(DataPackg)-28800;

        printf("%d",chuo);        
}


回复

使用道具 举报

发表于 2019-1-17 17:47:36 | 显示全部楼层
这是库函数本身的bug
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-18 11:59:35 | 显示全部楼层
Brave000 发表于 2019-1-17 17:47
这是库函数本身的bug

有解决方法吗,是从Linux中移植出来的代码,不知道之前在Linux中是怎么解决的,不过看了一下网上的讲解,这个函数设计的还是很巧妙的,三言两语解决了闰年的问题,如果1月份的问题也能解决就厉害了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-23 15:25 , Processed in 0.046404 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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