打印

请教8位机如何使用localtime()和mktime()函数

[复制链接]
4202|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mohanwei|  楼主 | 2009-4-1 20:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前虽然在PC上用过很多,但是对时间函数的复杂性还是估计不足……
现在有一个任务如下:
把从RTC时钟(包含年月日时分秒)转换为time_t类型(往往就是long),这样便于存储、通信。
但是——这是需要在8位机完成的。
mktime()原本采用linux的源码:
unsigned long mktime(const struct tm *TimeStr)
{
    struct tm Tm;
    uint Year;
    memcpy((unsigned char *)&Tm,(unsigned char *)TimeStr,sizeof(Tm));
    Year = Tm.year+2000;
    if (0 >= (int) (Tm.mon -= 2)) {    /* 1..12 -> 11,12,1..10 */
        Tm.mon += 12;      /* Puts Feb last since it has leap day */
        Year -= 1;
    }

    return (((
        (unsigned long) (Year/4 - Year/100 + Year/400 + 367*Tm.mon/12 + Tm.mday) +
            Year*365 - 719499
        )*24 + Tm.hour /* now have hours */
      )*60 + Tm.min /* now have minutes */
    )*60 + Tm.sec; /* finally seconds */
}
虽然有点难以理解,但好在短小精悍。
localtime()就难办了,研究过这个函数的人都知道,无论是linux还是window,C库里都是一大堆文件纠缠在一起的,想要剥离出来很难……
曾经花过半天时间从VC的CRT函数里提取,成功了,但是体积很庞大,且只能自己配对使用,和使用VC编译器本身的函数得到的结果截然不同!和linux得到的结果也截然不同!

现在想找一组能配对的localtime()和mktime()。望牛人们不吝赐教。

相关帖子

沙发
mohanwei|  楼主 | 2009-4-1 20:19 | 只看该作者

自己写 localtime 函数(含完整注释,代码)【转】

自己写 localtime 函数(含完整注释,代码)
减小字体 增大字体 作者:未知  来源:supcode.com收集整理  发布时间:2005-7-1 14:49:17
自己写 localtime 函数(含完整注释,代码)

//对时间转换有兴趣的可以看看。



//曾在某平台下多线程中使用localtime库函数。可恶的是,每当程序运行
//一段时间后,都要出现内存泄露。查了数个夜晚为什么,无从断定。
//只能狠狠心,自己写了个localtimes,功能与localtime库函数相同。
//有了它以后,我就不再因内存泄露而烦恼了。
//要知道“内存泄露”是程序员大的一大耻辱。

//这个localtimes在多线程下已经运行了3年,还没发生问题,放心使用。

//一年中每个月的天数,非闰年
const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/*++------------------------------------------------------------------------

  Function:
              localtimes

Modification History

Jurassic           2002.1    Created.              
--------------------------------------------------------------------------*/
void
__stdcall
localtimes(
   time_t time,
   long timezone,
           struct tm *tm_time
)
{
    unsigned  __int32 n32_Pass4year;
              __int32 n32_hpery;

    //计算时差
    time=time-timezone;
    
    if(time < 0)
    {
       time = 0;
    }
    //取秒时间
    tm_time->tm_sec=(int)(time % 60);
    time /= 60;
    //取分钟时间
    tm_time->tm_min=(int)(time % 60);
    time /= 60;
    //取过去多少个四年,每四年有 1461*24 小时
    n32_Pass4year=((unsigned int)time / (1461L * 24L));
    //计算年份
    tm_time->tm_year=(n32_Pass4year << 2)+70;
    //四年中剩下的小时数
    time %= 1461L * 24L;
    //校正闰年影响的年份,计算一年中剩下的小时数
    for (;;)
    {
        //一年的小时数
        n32_hpery = 365 * 24;
        //判断闰年
        if ((tm_time->tm_year & 3) == 0)
{
            //是闰年,一年则多24小时,即一天
            n32_hpery += 24;
}
        if (time < n32_hpery)
{
            break;
}
        tm_time->tm_year++;
        time -= n32_hpery;
    }
    //小时数
    tm_time->tm_hour=(int)(time % 24);
    //一年中剩下的天数
    time /= 24;
    //假定为闰年
    time++;
    //校正润年的误差,计算月份,日期
    if ((tm_time->tm_year & 3) == 0)
    {
if (time > 60)
{
time--;
}
else
{
if (time == 60)
{
tm_time->tm_mon = 1;
tm_time->tm_mday = 29;
return ;
}
}
    }
    //计算月日
    for (tm_time->tm_mon = 0; Days[tm_time->tm_mon] < time;tm_time->tm_mon++)
    {
          time -= Days[tm_time->tm_mon];
    }

    tm_time->tm_mday = (int)(time);

    return;

}


能联系到这个作者也不错,估计能再搞一个配对的mktime()出来。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

9320

帖子

24

粉丝