C語言時間轉(zhuǎn)換函數(shù)接口的用法全面講解
概述
在C語言中,時間轉(zhuǎn)換<time.h>:提供了時間處理的相關(guān)函數(shù)和類型。常用類型:time_t(表示時間戳,通常是long類型)、struct tm(分解時間結(jié)構(gòu)體)等。函數(shù)接口主要涉及以下幾個頭文件和函數(shù)。本文主要介紹這些函數(shù)的常用使用方法。
1 時間函數(shù)接口
1.1 接口函數(shù)介紹
在C語言中,時間轉(zhuǎn)換函數(shù)接口主要涉及以下幾個頭文件和函數(shù):
- <time.h>:提供了時間處理的相關(guān)函數(shù)和類型。
- 常用類型:time_t(表示時間戳,通常是long類型)、struct tm(分解時間結(jié)構(gòu)體)等。
常用的時間轉(zhuǎn)換函數(shù)包括:
- time_t time(time_t *tloc); 獲取當(dāng)前時間的時間戳。
- struct tm *localtime(const time_t *timep); 將時間戳轉(zhuǎn)換為本地時間的struct tm結(jié)構(gòu)。
- struct tm *gmtime(const time_t *timep); 將時間戳轉(zhuǎn)換為UTC時間的struct tm結(jié)構(gòu)。
- time_t mktime(struct tm *tm); 將struct tm結(jié)構(gòu)的時間轉(zhuǎn)換為時間戳(本地時間)。
- char *asctime(const struct tm *tm); 將struct tm結(jié)構(gòu)的時間轉(zhuǎn)換為字符串(格式固定)。
- char *ctime(const time_t *timep); 將時間戳轉(zhuǎn)換為本地時間的字符串(格式固定)。
格式化函數(shù):
- size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);
用于將struct tm格式的時間按照指定格式轉(zhuǎn)換為字符串。
1.2 功能函數(shù)說明
1) C語言中常用的時間轉(zhuǎn)換函數(shù)接口,包括:
- 獲取當(dāng)前時間 - 使用
time()函數(shù)獲取時間戳,localtime()和gmtime()轉(zhuǎn)換為本地時間和UTC時間 - 時間轉(zhuǎn)換為字符串 - 使用
asctime()和ctime()函數(shù) - 自定義時間格式 - 使用
strftime()函數(shù)實現(xiàn)靈活的格式輸出 - 計算時間差 - 使用
difftime()函數(shù)計算兩個時間點之間的差異 - 時間操作 - 使用
mktime()函數(shù)對時間結(jié)構(gòu)進行規(guī)范化并實現(xiàn)日期計算
2) tm 數(shù)據(jù)結(jié)構(gòu)
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
// Types
//
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
struct tm
{
int tm_sec; // seconds after the minute - [0, 60] including leap second
int tm_min; // minutes after the hour - [0, 59]
int tm_hour; // hours since midnight - [0, 23]
int tm_mday; // day of the month - [1, 31]
int tm_mon; // months since January - [0, 11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday - [0, 6]
int tm_yday; // days since January 1 - [0, 365]
int tm_isdst; // daylight savings time flag
};2 C語言時間轉(zhuǎn)換函數(shù)接口應(yīng)用
下面我將創(chuàng)建一個C語言程序,展示常見的時間轉(zhuǎn)換函數(shù)接口及其使用方法。這個程序會演示如何獲取當(dāng)前時間、轉(zhuǎn)換時間格式以及進行各種時間操作。
2.1 獲取當(dāng)前時間
C語言使用time()函數(shù)獲取時間戳,localtime()和gmtime()轉(zhuǎn)換為本地時間和UTC時間。
void print_current_time()
{
printf("1. 當(dāng)前時間:\n");
time_t raw_time;
struct tm *time_info;
// 獲取當(dāng)前時間戳
time(&raw_time);
// 轉(zhuǎn)換為本地時間結(jié)構(gòu)
time_info = localtime(&raw_time);
printf(" 時間戳: %ld\n", raw_time);
printf(" 本地時間: %d-%02d-%02d %02d:%02d:%02d\n",
time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
// 轉(zhuǎn)換為UTC時間
time_info = gmtime(&raw_time);
printf(" UTC時間: %d-%02d-%02d %02d:%02d:%02d\n",
time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
}運行程序,得到結(jié)果如下:
1. 當(dāng)前時間: 時間戳: 1757555139 本地時間: 2025-09-11 09:45:39 UTC時間: 2025-09-11 01:45:39
2.2 時間轉(zhuǎn)換為字符串
使用asctime()和ctime()函數(shù)用于時間轉(zhuǎn)換為字符串 ,其用法如下:
// 將時間轉(zhuǎn)換為字符串
void convert_time_to_string()
{
printf("2. 時間轉(zhuǎn)換為字符串:\n");
time_t raw_time;
char buffer[80];
time(&raw_time);
// 使用asctime轉(zhuǎn)換為字符串
printf(" asctime格式: %s", asctime(localtime(&raw_time)));
// 使用ctime轉(zhuǎn)換為字符串
printf(" ctime格式: %s", ctime(&raw_time));
}運行結(jié)果如下:
2. 時間轉(zhuǎn)換為字符串: asctime格式: Thu Sep 11 09:49:05 2025 ctime格式: Thu Sep 11 09:49:05 2025
2.3 計算時間差
使用difftime()函數(shù)計算兩個時間點之間的差異,其用法如下:
// 計算時間差
void calculate_time_difference() {
printf("4. 計算時間差:\n");
time_t start, end;
double diff;
time(&start);
printf(" 開始時間: %s", ctime(&start));
// 模擬一些耗時操作
for (long i = 0; i < 100000000; i++) {
// 空循環(huán)
}
time(&end);
printf(" 結(jié)束時間: %s", ctime(&end));
diff = difftime(end, start);
printf(" 耗時: %.2f 秒\n", diff);
}運行結(jié)果如下:
4. 計算時間差: 開始時間: Thu Sep 11 09:51:36 2025 結(jié)束時間: Thu Sep 11 09:51:37 2025 耗時: 1.00 秒
2.4 時間操作
// 時間操作
void manipulate_time()
{
printf("5. 時間操作:\n");
time_t raw_time;
struct tm *time_info;
char buffer[80];
time(&raw_time);
time_info = localtime(&raw_time);
printf(" 當(dāng)前時間: %s", asctime(time_info));
// 增加一天
time_info->tm_mday += 1;
mktime(time_info); // 規(guī)范化時間結(jié)構(gòu)
strftime(buffer, sizeof(buffer), "%Y-%m-%d", time_info);
printf(" 明天日期: %s\n", buffer);
// 減少一周
time_info->tm_mday -= 7;
mktime(time_info);
strftime(buffer, sizeof(buffer), "%Y-%m-%d", time_info);
printf(" 一周前日期: %s\n", buffer);
}運行結(jié)果如下:
5. 時間操作: 當(dāng)前時間: Thu Sep 11 09:53:44 2025 明天日期: 2025-09-12 一周前日期: 2025-09-05
2.5 源代碼文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h>
#include <errno.h>
#include <stdbool.h>
// 函數(shù)聲明
void print_current_time();
void convert_time_to_string();
void custom_time_format();
void calculate_time_difference();
void manipulate_time();
int test_rtc_main()
{
printf("C語言時間轉(zhuǎn)換函數(shù)接口示例\n");
printf("==========================\n\n");
// 1. 打印當(dāng)前時間
print_current_time();
printf("\n");
// 2. 時間轉(zhuǎn)換為字符串
convert_time_to_string();
printf("\n");
// 3. 自定義時間格式
custom_time_format();
printf("\n");
// 4. 計算時間差
calculate_time_difference();
printf("\n");
// 5. 時間操作
manipulate_time();
return 0;
}
// 打印當(dāng)前時間
void print_current_time()
{
printf("1. 當(dāng)前時間:\n");
time_t raw_time;
struct tm* time_info;
// 獲取當(dāng)前時間戳
time(&raw_time);
// 轉(zhuǎn)換為本地時間結(jié)構(gòu)
time_info = localtime(&raw_time);
printf(" 時間戳: %ld\n", raw_time);
printf(" 本地時間: %d-%02d-%02d %02d:%02d:%02d\n",
time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
// 轉(zhuǎn)換為UTC時間
time_info = gmtime(&raw_time);
printf(" UTC時間: %d-%02d-%02d %02d:%02d:%02d\n",
time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
}
// 將時間轉(zhuǎn)換為字符串
void convert_time_to_string()
{
printf("2. 時間轉(zhuǎn)換為字符串:\n");
time_t raw_time;
char buffer[80];
time(&raw_time);
// 使用asctime轉(zhuǎn)換為字符串
printf(" asctime格式: %s", asctime(localtime(&raw_time)));
// 使用ctime轉(zhuǎn)換為字符串
printf(" ctime格式: %s", ctime(&raw_time));
}
// 自定義時間格式
void custom_time_format()
{
printf("3. 自定義時間格式:\n");
time_t raw_time;
struct tm* time_info;
char buffer[80];
time(&raw_time);
time_info = localtime(&raw_time);
// 使用strftime自定義格式
strftime(buffer, sizeof(buffer), "%Y年%m月%d日 %H時%M分%S秒", time_info);
printf(" 中文格式: %s\n", buffer);
strftime(buffer, sizeof(buffer), "%A, %B %d, %Y", time_info);
printf(" 英文格式: %s\n", buffer);
strftime(buffer, sizeof(buffer), "日期: %Y-%m-%d 時間: %H:%M:%S", time_info);
printf(" 自定義格式: %s\n", buffer);
}
// 計算時間差
void calculate_time_difference() {
printf("4. 計算時間差:\n");
time_t start, end;
double diff;
time(&start);
printf(" 開始時間: %s", ctime(&start));
// 模擬一些耗時操作
for (long i = 0; i < 100000000; i++) {
// 空循環(huán)
}
time(&end);
printf(" 結(jié)束時間: %s", ctime(&end));
diff = difftime(end, start);
printf(" 耗時: %.2f 秒\n", diff);
}
// 時間操作
void manipulate_time() {
printf("5. 時間操作:\n");
time_t raw_time;
struct tm* time_info;
char buffer[80];
time(&raw_time);
time_info = localtime(&raw_time);
printf(" 當(dāng)前時間: %s", asctime(time_info));
// 增加一天
time_info->tm_mday += 1;
mktime(time_info); // 規(guī)范化時間結(jié)構(gòu)
strftime(buffer, sizeof(buffer), "%Y-%m-%d", time_info);
printf(" 明天日期: %s\n", buffer);
// 減少一周
time_info->tm_mday -= 7;
mktime(time_info);
strftime(buffer, sizeof(buffer), "%Y-%m-%d", time_info);
printf(" 一周前日期: %s\n", buffer);
}
// 將日期時間轉(zhuǎn)換為Unix時間戳
void convert_human_to_unix(int year, int month, int day, int hour, int min, int sec)
{
struct tm timeinfo;
time_t timestamp;
// 填充tm結(jié)構(gòu)
memset(&timeinfo, 0, sizeof(struct tm));
timeinfo.tm_year = year - 1900; // 年份從1900開始計算
timeinfo.tm_mon = month - 1; // 月份從0開始
timeinfo.tm_mday = day;
timeinfo.tm_hour = hour;
timeinfo.tm_min = min;
timeinfo.tm_sec = sec;
timeinfo.tm_isdst = -1; // 讓系統(tǒng)自動確定夏令時
// 轉(zhuǎn)換為Unix時間戳
timestamp = mktime(&timeinfo);
if (timestamp == -1) {
printf(" %04d-%02d-%02d %02d:%02d:%02d -> 無效時間\n",
year, month, day, hour, min, sec);
}
else {
printf(" %04d-%02d-%02d %02d:%02d:%02d -> %ld\n",
year, month, day, hour, min, sec, timestamp);
}
}
到此這篇關(guān)于C語言時間轉(zhuǎn)換函數(shù)接口的用法詳解的文章就介紹到這了,更多相關(guān)C時間轉(zhuǎn)換函數(shù)接口用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT獲取顯示當(dāng)前時間和日期的方法(用QTime,QDate和QDateTime)
獲取當(dāng)期日期時間在我們?nèi)粘i_發(fā)中經(jīng)常會遇到,下面這篇文章主要給大家介紹了關(guān)于QT獲取顯示當(dāng)前時間和日期的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08
Linux c 運行時獲取動態(tài)庫所在路徑的操作方法
運行時獲取動態(tài)庫地址除了dladdr和解析/proc/<pid>/maps還可以有一些別的做法,比如可以用nm獲取庫文件的符號表進行對比,但如果庫文件被strip處理過就不能這么用了,本文介紹的兩種方案是泛用性最高的,感興趣的朋友一起看看吧2025-06-06

