localtime和mktime

有些系统没有localtime和maketime, 把linux内核里边这两函数扣出来用。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdint.h>

struct tm {
    /*
     * the number of seconds after the minute, normally in the range
     * 0 to 59, but can be up to 60 to allow for leap seconds
     */
    int tm_sec;
    /* the number of minutes after the hour, in the range 0 to 59*/
    int tm_min;
    /* the number of hours past midnight, in the range 0 to 23 */
    int tm_hour;
    /* the day of the month, in the range 1 to 31 */
    int tm_mday;
    /* the number of months since January, in the range 0 to 11 */
    int tm_mon;
    /* the number of years since 1900 */
    long tm_year;
    /* the number of days since Sunday, in the range 0 to 6 */
    int tm_wday;
    /* the number of days since January 1, in the range 0 to 365 */
    int tm_yday;

    int tm_isdst;
};

static unsigned long mktime(const unsigned int year0, const unsigned int mon0,
        const unsigned int day, const unsigned int hour,
        const unsigned int min, const unsigned int sec)
{
    unsigned int mon = mon0, year = year0;

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

    return ((((unsigned long)
          (year/4 - year/100 + year/400 + 367*mon/12 + day) +
          year*365 - 719499
        )*24 + hour /* now have hours */
      )*60 + min /* now have minutes */
    )*60 + sec; /* finally seconds */
}

static struct tm * localtime_r(time_t *srctime,struct tm *tm_time)
{
    long int n32_Pass4year,n32_hpery;
    const static char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const static int ONE_YEAR_HOURS = 8760;

    time_t time = *srctime;
    time=time+28800;
    tm_time->tm_isdst=0;
    if(time < 0)
    {
    time = 0;
    }

    tm_time->tm_sec=(int)(time % 60);
    time /= 60;
    tm_time->tm_min=(int)(time % 60);
    time /= 60;
    tm_time->tm_wday=(time/24+4)%7;
    n32_Pass4year=((unsigned int)time / (1461L * 24L));
    tm_time->tm_year=(n32_Pass4year << 2)+70;
    time %= 1461L * 24L;
    tm_time->tm_yday=(time/24)%365;

    for (;;)
    {
        n32_hpery = ONE_YEAR_HOURS;
        if ((tm_time->tm_year & 3) == 0)
        {
            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 tm_time;
            }
        }
    }

    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 tm_time;
}

int main(void)
{
    uint32_t now = 1451577600; /*2016/01/01 00:00:00*/
    struct tm tm = {0};
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    localtime_r(&now, &tm);
    printf("%d/%d/%d \n", 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday);
    printf("%s %d:%d:%d \n", wday[tm.tm_wday], tm.tm_hour, tm.tm_min, tm.tm_sec);
    now = mktime(1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
    printf("rtc value : %d\n", now);
    return 0;
}

end

时间: 2024-11-05 20:39:27

localtime和mktime的相关文章

C run-time函数总览

Argument Access(参数访问):变长参数列表.这个模块提供了三个宏:va_arg.va_end和va_start,用来实现变长参数列表的访问. Buffer Manipulation(内存操作):按字节处理内存区域.主要函数:memcpy.memmove.memset等. Byte classification(字节分类):用来测试在多字节字符中满足一定条件的特殊字节.例如:isleadbyte.感觉用途不是很广,暂且忽略. Character classification(字符分类

每天进步一点点——Linux系统时间来处理

转载请注明出处:http://blog.csdn.net/cywosp/article/details/25839551 在程序中时间处理往往是一个麻烦的事.Linux系统提供了非常多关于时间处理的函数,我们能够用这些函数来完毕我们所须要的功能.那么在程序中通常会关心哪些时间问题呢? 真实时间:程序执行的时间,即程序启动到程序消亡所用时间或程序执行到如今所经过的时间 进程时间:一个进程所使用的CPU时间总量.适用于对程序.算法性能的检查或优化 本文仅仅关注真实时间的处理与转换 一.Epoch 不

Linux时间函数

系统环境:ubuntu10.04 1.Linux下常用时间类型time_t.struct tm.struct timeval.struct timespec 1.1 time_t时间类型time_t类型在time.h中定义:typedef long time_t; 可见,time_t实际是一个长整型.其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数.由于time_t类型长度的

python time

import time #time.time() 获取时间戳 print time.time() #将时间戳转成元组 #time.localtime() now_time_1 = time.localtime(time.time()) print now_time_1 #time.strptime(time_str, 格式) 格式匹配字符串的时间格式 now_time_2 = time.strptime("2017 01 01", "%Y %m %d") print

python时间模块

import timeimport datetimeprint(time.altzone/3600)    返回以秒为单位的UTC时间print(time.asctime())   返回日期t=time.localtime()  返回时间对象print(t.tm_year,t.tm_mday) t.tm_year:返回年份 t.tm_mday:当月开始到当天的天数print(time.time()+3600*3)从1970年以秒为单位再加3个小时print(time.time())print(t

10.时间编程

1.时间的类型: Coordinated Universal Time(UTC):世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT). Calendar Time:日历时间,是用"从一个标准时间点(如:1970年1月1日0点)到此时经过的秒数"来表示的时间. ? 2.时间操作: 获取日历时间:man 2 time: (主要:man 后面的数字表示的是章节:1(留空):命令 2:函数 3:系统调用.) NAME time - get tim

随便写点时间相关的模块

一.time >>> time.time() 1446193516.198661 返回的是一个float类型的数值,计算从1970年1月1日0时0分0秒到当前时间的秒偏移. >>> time.localtime() time.struct_time(tm_year=2015, tm_mon=10, tm_mday=30, tm_hour=16, tm_min=25, tm_sec=45, tm_wday=4, tm_yday=303, tm_isdst=0) >&

python常用模块上篇

python常见模块 分两篇分别介绍下述模块 time模块 random模块 hashlib模块 os模块 sys模块 logging模块 序列号模块 configparser模块 re模块 time模块 在python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: 1)时间戳:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. (2)格

《unix环境高级编程》 读书笔记 目录

近来读书,做些笔记,来年好翻翻. 本文所使用的操作系统为 CentOS7.0,如果不想装双系统的可以装虚拟机,可以参考这里: http://blog.csdn.net/alex_my/article/details/38142229 当然啦,直接装个再好不过了. 1 链接:http://blog.csdn.net/alex_my/article/details/39079053 涉及主题:文件描述符,系统资源限制,文件相关,close-on-exec, 涉及函数:getrlimit, setrl