最近我在使用 C 語言編寫一個程序時,遇到了一個奇怪的問題:日期轉換成 JSON 數據時出現了錯誤。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cjson/cJSON.h>
int main() {
time_t t = time(NULL);
struct tm *tm = localtime(&t);
char strftime_buf[64];
strftime(strftime_buf, sizeof(strftime_buf), "%Y-%m-%d", tm);
cJSON *json = cJSON_CreateObject();
cJSON_AddStringToObject(json, "date", strftime_buf);
char *json_str = cJSON_Print(json);
printf("%s\n", json_str);
cJSON_Delete(json);
free(json_str);
return 0;
}
在上面的代碼中,我使用了 CJSON 庫來構建 JSON 數據。首先使用 time() 函數獲取當前的日期,然后使用 localtime() 函數將日期轉換為本地時間,再使用 strftime() 函數將日期格式化成 "%Y-%m-%d" 的形式。接著使用 cJSON_CreateObject() 函數創建一個 cJSON 對象,使用 cJSON_AddStringToObject() 函數將日期添加到 JSON 中,并使用 cJSON_Print() 函數將 JSON 格式化成字符串。最后,使用 cJSON_Delete() 函數釋放 cJSON 對象,使用 free() 函數釋放 JSON 字符串。
但是當我運行程序時,卻發現輸出的結果并不是我期望的 JSON 格式:
{"date":"1989-19-89"}
可以看到,日期格式化出了問題,輸出的實際日期為 "1989-19-89",而不是正確的日期 "2022-03-15"。
經過一番排查,我發現問題出在 strftime() 函數的參數設置上。"%Y" 表示年份的四位數,"%m" 表示月份的兩位數,但是我錯誤地將 "%d" 寫成了 "%m",導致月份和日期的格式都變成了兩位數。因此,輸出的日期格式就變成了 "1989-19-89"。通過修改 strftime() 函數的參數,將 "%m" 改為 "%d",就能夠得到正確的日期格式:
strftime(strftime_buf, sizeof(strftime_buf), "%Y-%m-%d", tm);
經過這次問題排查,我深刻地認識到了寫代碼要認真仔細,不能粗心大意。同時也感受到了編程之路上不斷遇到的困難,只有不斷探索、不放棄,才能成為真正的編程高手。