C语言获取并格式化时间

前几天使用AWS V4签名时,需要一种特殊时间格式(NNNNMMDDTHHMMSSZ),在node还是比较好拼装,但C里面还没有拼这种比较奇怪的格式。这里记录下一下过程。

环境:Linux Ubuntu

1 函数

主要涉及到time.h头文件中以下三个函数 :

1.1 time

time_t time(time_t *t);

time() 是指返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数的函数,主要用来获取当前的系统时间,返回的结果是一个time_t类型。

1.2 gmtime

struct tm *gmtime(const time_t *timep);

gmtime是把日期和时间转换为格林威治(GMT)时间的函数。然后将结果由结构tm返回。

1.3 struct tm

struct tm {
    int tm_sec; /* 秒 – 取值区间为[0,59] */
    int tm_min; /* 分 - 取值区间为[0,59] */
    int tm_hour; /* 时 - 取值区间为[0,23] */
    int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
    int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
    int tm_year; /* 年份,其值等于实际年份减去1900 */
    int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
    int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
    int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负。
    long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/
    const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/
};

1.4 sprintf

int sprintf( char *buffer, const char *format, [ argument] … );

sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性, 所以请预估好要格式化的大小。
参数:
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]…:可选参数,可以是任何类型的数据。
返回:
返回写入buffer 的字符数,出错则返回-1. 如果 buffer 或 format 是空指针,且不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。

2 Sample Code

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

int getTimeString(char* timeStr){
    time_t times = time(NULL);
    struct tm* utcTime = gmtime(&times);
    int timeStrLen = sprintf(timeStr, "%04d%02d%02dT%02d%02d%02dZ", utcTime->tm_year+1900, utcTime->tm_mon+1, utcTime->tm_mday, utcTime->tm_hour, utcTime->tm_min, utcTime->tm_sec);
    return timeStrLen;
}

int main(void){
    char timeStr[40];
    int timeStrLen = getTimeString(timeStr);
    printf("%s %d\n", timeStr, timeStrLen);
    return 0;
}

编译测试:
gcc test.c -o sample
./sample
输出:
20180806T114445Z 16

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页