time函数计算时间

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

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

#include <stdio.h>
#include <time.h>

int main(void)
{
    printf("%d\n", 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\n", 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\n", 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或类似的函数好了(这些函数内部肯定也要考虑时区的)。

 

posted on 2014-01-22 09:05  刘宝成  阅读(1861)  评论(0编辑  收藏  举报

导航