• time函数计算时间


    学过C语言的都知道有个time函数可以计算时间,

    也好像知道time(NULL)返回的是一个距离1970年1月1日0时0分0秒的秒数。

    #include <stdio.h>
    #include <time.h>
    
    int main(void)
    {
        printf("%d
    ", time(NULL));
        return 0;
    }

    运行结果:1390351382

    乍一看,说法不假,还真是那么一个秒数。

    还有不相信的,进一步把秒数、分钟数、小时数分别取出来。

    #include <stdio.h>
    #include <time.h>
    
    int main(void)
    {
        int t, s, m, h;
    
        t = time(NULL);
    
        //
        s = t % 60;
        t /= 60;
    
        // 分钟
        m = t % 60;
        t /= 60;
    
        // 小时
        h = t % 24;
        
        printf("%d:%d:%d
    ", h, m, s);
        return 0;
    }

    运行结果:0:53:5

    奇怪!我的电脑明明是8点53分,为什么上面是0点呢?

    哎!还是来个彻底的吧!根据这个秒数把日历时间算出来,

    看看到底有什么猫腻。

    #include <stdio.h>
    #include <time.h>
    
    char month[2][12] = { 
        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 
        31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 
    };
    
    // 四年一闰,百年不闰,四百年再闰
    int is_leap_year(int year)
    {
        // 先找四百年,是闰年
        if (year % 400 == 0)
            return 1;
    
        // 再找一百、二百、三百年,是平年
        if (year % 100 == 0)
            return 0;
    
        // 最后找四的倍数年,是闰年
        if (year % 4 == 0)
            return 1;
    
        // 不是四百的倍数,
        // 不是一百、二百、三百的倍数,
        // 不是四的倍数,是平年
        return 0;
    }
    
    int main(void)
    {
        int t, s, m, h, D, M, Y;
        int leap, i;
    
        t = time(NULL);
        //
        s = t % 60;
        t /= 60;
        // 分钟
        m = t % 60;
        t /= 60;
        // 小时
        h = t % 24;
        t /= 24;
    
        //
        Y = 1970;
        while (1)
        {
            leap = is_leap_year(Y);
            if (leap && t >= 366)
            {
                t -= 366;
                Y++;
            }
            else if (!leap && t >= 365)
            {
                t -= 365;
                Y++;
            }
            else
                break;
        }
    
        //
        leap = is_leap_year(Y);
        for (i = 0, M = 1; t >= month[leap][i] ; i++, M++)
            t -= month[leap][i];
    
        //
        D = t + 1;
    
        printf("%d-%d-%d %d:%d:%d
    ", Y, M, D, h, m, s);
        return 0;
    }

    运行结果:2014-1-22 0:56:3

    哦,日期是一样的,分钟也是一样,秒数应该也差不多,只有小时数差了8小时。

    这回可以分析了!

    我的电脑位于东八区,比世界统一时间(零区时间)快8个小时,

    而time(NULL)函数返回的恰恰是世界统一时间。

    要想获得本地时间,还要再调用localtime。

    #include <stdio.h>
    #include <time.h>
    
    int main(void)
    {
        time_t rawtime;
        struct tm *timeinfo;
    
        time(&rawtime);
        timeinfo = localtime(&rawtime);
        printf("本地时间:%s", asctime(timeinfo));
    
        return 0;
    }

    运行结果:本地时间:Wed Jan 22 09:28:34 2014

    这次返回的结果和我电脑显示的时间是一致的(位于格林威治的世界标准时间到了1点28分)。

    C语言作为基础语言实现了这样的时间计算方法,

    即世界统一时间和本地时间分离的方法。

    好多后来的语言也都有这种机制,

    你直接调用某个函数返回的秒数,其实是0时区代表的秒数,

    用这个秒数计算出的时间只能是0时区的时间,

    而想要东八区的时间,你要再加上8小时。

    当然一般也很少有这样一步一步算出来的,

    想获得本地时间(对我们来说就是东八区的时间),

    直接调用localtime或类似的函数好了(这些函数内部肯定也要考虑时区的)。

  • 相关阅读:
    Core Animation简介
    objective-c 常用函数、变量
    NSString判断纯数字
    自定义对话框AlterView
    IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)
    真机调试问题 错误集合
    block使用小结、在arc中使用block、如何防止循环引用
    View和viewController的生命周期
    IOS侧滑和webview
    Linker Error、MRC与ARC、导航条背景
  • 原文地址:https://www.cnblogs.com/liubaocheng999/p/3529215.html
Copyright © 2020-2023  润新知