从Nginx源码中学习如何获取时间

最近因为工作接触到Nginx的学习,我就把Nginx的源代码下载下来,然后对其进行了分析。发现Nginx的性能强大离不开作者编码的苦心,作者将C的性能发挥到了极致,每个变量都用得非常出神入化。有如此强大的功能,才支撑了全球约一半的市场,

拿一个例子来说,之前我写过关于C获取时间的文章,直接调用的系统库函数将毫秒转为当前时间。我看Nginx的时候,发现他是自己写的转换函数,那我就看Nginx是如何将表示时间的毫秒转换为具体的日期的。

下载之后找到src/core/ngx_times.c。

我将记录下来了,ngx_gmtime函数就是获取当前时间。

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

typedef struct tm             ngx_tm_t;

typedef intptr_t        ngx_int_t;
void
ngx_gmtime(time_t t, ngx_tm_t* tp)
{
    ngx_int_t  sec, min, hour, mday, mon, year, wday, yday, days;

    days = t / 86400;

    /* Jaunary 1, 1970 was Thursday */
    wday = (4 + days) % 7;

    t %= 86400;
    hour = t / 3600;
    t %= 3600;
    min = t / 60;
    sec = t % 60;

    /* the algorithm based on Gauss's formula */

    days = days - (31 + 28) + 719527;

    year = days * 400 / (365 * 400 + 100 - 4 + 1);
    yday = days - (365 * year + year / 4 - year / 100 + year / 400);

    mon = (yday + 31) * 12 / 367;
    mday = yday - (mon * 367 / 12 - 31);

    mon += 2;

    if (yday >= 306) {

        /*
         * there is no "yday" in Win32 SYSTEMTIME
         *
         * yday -= 306;
         */

        year++;
        mon -= 12;

        if (mday == 0) {
            /* Jaunary 31 */
            mon = 1;
            mday = 31;

        }
        else if (mon == 2) {

            if ((year % 4 == 0) && (year % 100 || (year % 400 == 0))) {
                if (mday > 29) {
                    mon = 3;
                    mday -= 29;
                }

            }
            else if (mday > 28) {
                mon = 3;
                mday -= 28;
            }
        }
        /*
         *  there is no "yday" in Win32 SYSTEMTIME
         *
         *  } else {
         *      yday += 31 + 28;
         *
         *      if ((year % 4 == 0) && (year % 100 || (year % 400 == 0))) {
         *          yday++;
         *      }
         */
    }

    tp->tm_sec = (int)sec;
    tp->tm_min = (int)min;
    tp->tm_hour = (int)hour;
    tp->tm_mday = (int)mday;
    tp->tm_mon = (int)mon;
    tp->tm_year = (int)year;
    tp->tm_wday = (int)wday;
}
int main()
{   
    time_t t = time(NULL);
    ngx_tm_t tp;
    ngx_gmtime(t, &tp);
    printf("%d年%d月%d日 %d时%d分%d秒", tp.tm_year, tp.tm_mon, tp.tm_mday, tp.tm_hour + 8, tp.tm_min, tp.tm_sec);
}

结果如下:

需要注意的是,生成的是UTC标准时间。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值