C 日期时间


C语言标准库提供了日期和时间的操作函数,包含得到当前时间,日期格式之间的转换,日期和字符串之间的转换。


C语言中有3种时间表示方式:

  • 时间戮(timestamp, time_t类型),即UTC时间(全球标准时间)和1970年1月1日0时0分0秒之间相差的秒数表示的时间。
  • 日历时间(struct tm类型),即以年、月、日、时、分、秒表示的时间。
  • 以字符串表示的日历时间。

日历时间又可以分为UTC日历时间和本地日历时间。UTC日历时间 + 时区差 = 本地日历时间。北京时间和UTC时间的时区差是8小时。

时间操作

time函数得到当前时间戮。如果time函数的参数不是空指针,参数指向的对象被设置为当前的日历时间。

clock函数返回程序启动后经过了多少个时钟周期。

difftime函数返回两个秒数表示的时间之间相差的秒数。

下面是时间操作的例子:

#include <stdio.h>
#include <time.h>
int main(int argc, const char * argv[]) {
    unsigned long t;
    time_t time1, time2;

    time_t seconds = time(&time2);
    printf("current time : %ld seconds \n", seconds); // 1525079403

    for (int i = 0; i < 700000000; i++)
        ;

    time(&time1);
    double d = difftime(time1, time2);
    printf("diff time is %f seconds \n", d);  // 2.000000

    t = clock();
    printf("program runs %ld tick count \n", t);  // 1541232

    return 0;
}

时间格式转换

gmtime函数将时间戮转换成UTC日历时间。

localtime函数将时间戮转换成本地日历时间。

mktime函数将本地日历时间转换成时间戮。mktime函数是localtime函数的相反操作。

strftime函数将日历时间转换成自定义格式的字符串。

ctime函数将时间戮转换成以字符串表示的本地日历时间,格式为"Www Mmm dd hh:mm:ss yyyy"。Www是星期几,Mmm是字符表示的月,dd是日。hh:mm:ss是时间,yyyy是年。字符串后面跟一个'\n'和终止字符'\0'。

asctime函数将日历时间转换成字符串,格式为“Www Mmm dd hh:mm:ss yyyy\n”。

下面是时间格式转换的例子:

#include <stdio.h>
#include <time.h>
int main(int argc, const char * argv[]) {
    char s[70];
    struct tm time = { .tm_year=117,
        .tm_mon=11,
        .tm_mday=2,
        .tm_hour=23,
        .tm_min=5,
        .tm_sec=10
    };

    // mktime
    time_t seconds = mktime(&time);
    printf("seconds : %ld \n", seconds);  // 1512227110

    // localtime
    struct tm *time2 = localtime(&seconds);
    if (strftime(s, sizeof s, "%Y-%m-%d %H:%M:%S", time2)) {
        printf("local time: %s \n", s); // 2017-12-02 23:05:10
    } else {
        puts("strftime failed");
    }

    // asctime
    printf("asctime : %s \n", asctime(time2));  // Sat Dec  2 23:05:10 2017

    // gmtime
    struct tm *time3 = gmtime(&seconds);
    if (strftime(s, sizeof s, "%Y-%m-%d %H:%M:%S", time3)) {
        printf("UTC time: %s \n", s); // 2017-12-02 15:05:10
    } else {
        puts("strftime failed");
    }

    // ctime
    printf("%s", ctime(&seconds));  // Sat Dec  2 23:05:10 2017

    return 0;
}