1. 程式人生 > >C語言獲取並格式化時間

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