C語言時(shí)間轉(zhuǎn)換函數(shù)接口的用法全面講解
概述
在C語言中,時(shí)間轉(zhuǎn)換<time.h>:提供了時(shí)間處理的相關(guān)函數(shù)和類型。常用類型:time_t(表示時(shí)間戳,通常是long類型)、struct tm(分解時(shí)間結(jié)構(gòu)體)等。函數(shù)接口主要涉及以下幾個(gè)頭文件和函數(shù)。本文主要介紹這些函數(shù)的常用使用方法。
1 時(shí)間函數(shù)接口
1.1 接口函數(shù)介紹
在C語言中,時(shí)間轉(zhuǎn)換函數(shù)接口主要涉及以下幾個(gè)頭文件和函數(shù):
- <time.h>:提供了時(shí)間處理的相關(guān)函數(shù)和類型。
- 常用類型:time_t(表示時(shí)間戳,通常是long類型)、struct tm(分解時(shí)間結(jié)構(gòu)體)等。
常用的時(shí)間轉(zhuǎn)換函數(shù)包括:
- time_t time(time_t *tloc); 獲取當(dāng)前時(shí)間的時(shí)間戳。
- struct tm *localtime(const time_t *timep); 將時(shí)間戳轉(zhuǎn)換為本地時(shí)間的struct tm結(jié)構(gòu)。
- struct tm *gmtime(const time_t *timep); 將時(shí)間戳轉(zhuǎn)換為UTC時(shí)間的struct tm結(jié)構(gòu)。
- time_t mktime(struct tm *tm); 將struct tm結(jié)構(gòu)的時(shí)間轉(zhuǎn)換為時(shí)間戳(本地時(shí)間)。
- char *asctime(const struct tm *tm); 將struct tm結(jié)構(gòu)的時(shí)間轉(zhuǎn)換為字符串(格式固定)。
- char *ctime(const time_t *timep); 將時(shí)間戳轉(zhuǎn)換為本地時(shí)間的字符串(格式固定)。
格式化函數(shù):
- size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);
用于將struct tm格式的時(shí)間按照指定格式轉(zhuǎn)換為字符串。
1.2 功能函數(shù)說明
1) C語言中常用的時(shí)間轉(zhuǎn)換函數(shù)接口,包括:
- 獲取當(dāng)前時(shí)間 - 使用
time()函數(shù)獲取時(shí)間戳,localtime()和gmtime()轉(zhuǎn)換為本地時(shí)間和UTC時(shí)間 - 時(shí)間轉(zhuǎn)換為字符串 - 使用
asctime()和ctime()函數(shù) - 自定義時(shí)間格式 - 使用
strftime()函數(shù)實(shí)現(xiàn)靈活的格式輸出 - 計(jì)算時(shí)間差 - 使用
difftime()函數(shù)計(jì)算兩個(gè)時(shí)間點(diǎn)之間的差異 - 時(shí)間操作 - 使用
mktime()函數(shù)對(duì)時(shí)間結(jié)構(gòu)進(jìn)行規(guī)范化并實(shí)現(xiàn)日期計(jì)算
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語言時(shí)間轉(zhuǎn)換函數(shù)接口應(yīng)用
下面我將創(chuàng)建一個(gè)C語言程序,展示常見的時(shí)間轉(zhuǎn)換函數(shù)接口及其使用方法。這個(gè)程序會(huì)演示如何獲取當(dāng)前時(shí)間、轉(zhuǎn)換時(shí)間格式以及進(jìn)行各種時(shí)間操作。
2.1 獲取當(dāng)前時(shí)間
C語言使用time()函數(shù)獲取時(shí)間戳,localtime()和gmtime()轉(zhuǎn)換為本地時(shí)間和UTC時(shí)間。
void print_current_time()
{
printf("1. 當(dāng)前時(shí)間:\n");
time_t raw_time;
struct tm *time_info;
// 獲取當(dāng)前時(shí)間戳
time(&raw_time);
// 轉(zhuǎn)換為本地時(shí)間結(jié)構(gòu)
time_info = localtime(&raw_time);
printf(" 時(shí)間戳: %ld\n", raw_time);
printf(" 本地時(shí)間: %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時(shí)間
time_info = gmtime(&raw_time);
printf(" UTC時(shí)間: %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);
}運(yùn)行程序,得到結(jié)果如下:
1. 當(dāng)前時(shí)間: 時(shí)間戳: 1757555139 本地時(shí)間: 2025-09-11 09:45:39 UTC時(shí)間: 2025-09-11 01:45:39
2.2 時(shí)間轉(zhuǎn)換為字符串
使用asctime()和ctime()函數(shù)用于時(shí)間轉(zhuǎn)換為字符串 ,其用法如下:
// 將時(shí)間轉(zhuǎn)換為字符串
void convert_time_to_string()
{
printf("2. 時(shí)間轉(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));
}運(yùn)行結(jié)果如下:
2. 時(shí)間轉(zhuǎn)換為字符串: asctime格式: Thu Sep 11 09:49:05 2025 ctime格式: Thu Sep 11 09:49:05 2025
2.3 計(jì)算時(shí)間差
使用difftime()函數(shù)計(jì)算兩個(gè)時(shí)間點(diǎn)之間的差異,其用法如下:
// 計(jì)算時(shí)間差
void calculate_time_difference() {
printf("4. 計(jì)算時(shí)間差:\n");
time_t start, end;
double diff;
time(&start);
printf(" 開始時(shí)間: %s", ctime(&start));
// 模擬一些耗時(shí)操作
for (long i = 0; i < 100000000; i++) {
// 空循環(huán)
}
time(&end);
printf(" 結(jié)束時(shí)間: %s", ctime(&end));
diff = difftime(end, start);
printf(" 耗時(shí): %.2f 秒\n", diff);
}運(yùn)行結(jié)果如下:
4. 計(jì)算時(shí)間差: 開始時(shí)間: Thu Sep 11 09:51:36 2025 結(jié)束時(shí)間: Thu Sep 11 09:51:37 2025 耗時(shí): 1.00 秒
2.4 時(shí)間操作
// 時(shí)間操作
void manipulate_time()
{
printf("5. 時(shí)間操作:\n");
time_t raw_time;
struct tm *time_info;
char buffer[80];
time(&raw_time);
time_info = localtime(&raw_time);
printf(" 當(dāng)前時(shí)間: %s", asctime(time_info));
// 增加一天
time_info->tm_mday += 1;
mktime(time_info); // 規(guī)范化時(shí)間結(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);
}運(yùn)行結(jié)果如下:
5. 時(shí)間操作: 當(dāng)前時(shí)間: 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語言時(shí)間轉(zhuǎn)換函數(shù)接口示例\n");
printf("==========================\n\n");
// 1. 打印當(dāng)前時(shí)間
print_current_time();
printf("\n");
// 2. 時(shí)間轉(zhuǎn)換為字符串
convert_time_to_string();
printf("\n");
// 3. 自定義時(shí)間格式
custom_time_format();
printf("\n");
// 4. 計(jì)算時(shí)間差
calculate_time_difference();
printf("\n");
// 5. 時(shí)間操作
manipulate_time();
return 0;
}
// 打印當(dāng)前時(shí)間
void print_current_time()
{
printf("1. 當(dāng)前時(shí)間:\n");
time_t raw_time;
struct tm* time_info;
// 獲取當(dāng)前時(shí)間戳
time(&raw_time);
// 轉(zhuǎn)換為本地時(shí)間結(jié)構(gòu)
time_info = localtime(&raw_time);
printf(" 時(shí)間戳: %ld\n", raw_time);
printf(" 本地時(shí)間: %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時(shí)間
time_info = gmtime(&raw_time);
printf(" UTC時(shí)間: %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);
}
// 將時(shí)間轉(zhuǎn)換為字符串
void convert_time_to_string()
{
printf("2. 時(shí)間轉(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));
}
// 自定義時(shí)間格式
void custom_time_format()
{
printf("3. 自定義時(shí)間格式:\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時(shí)%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 時(shí)間: %H:%M:%S", time_info);
printf(" 自定義格式: %s\n", buffer);
}
// 計(jì)算時(shí)間差
void calculate_time_difference() {
printf("4. 計(jì)算時(shí)間差:\n");
time_t start, end;
double diff;
time(&start);
printf(" 開始時(shí)間: %s", ctime(&start));
// 模擬一些耗時(shí)操作
for (long i = 0; i < 100000000; i++) {
// 空循環(huán)
}
time(&end);
printf(" 結(jié)束時(shí)間: %s", ctime(&end));
diff = difftime(end, start);
printf(" 耗時(shí): %.2f 秒\n", diff);
}
// 時(shí)間操作
void manipulate_time() {
printf("5. 時(shí)間操作:\n");
time_t raw_time;
struct tm* time_info;
char buffer[80];
time(&raw_time);
time_info = localtime(&raw_time);
printf(" 當(dāng)前時(shí)間: %s", asctime(time_info));
// 增加一天
time_info->tm_mday += 1;
mktime(time_info); // 規(guī)范化時(shí)間結(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);
}
// 將日期時(shí)間轉(zhuǎn)換為Unix時(shí)間戳
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開始計(jì)算
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)自動(dòng)確定夏令時(shí)
// 轉(zhuǎn)換為Unix時(shí)間戳
timestamp = mktime(&timeinfo);
if (timestamp == -1) {
printf(" %04d-%02d-%02d %02d:%02d:%02d -> 無效時(shí)間\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語言時(shí)間轉(zhuǎn)換函數(shù)接口的用法詳解的文章就介紹到這了,更多相關(guān)C時(shí)間轉(zhuǎn)換函數(shù)接口用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt Creator實(shí)現(xiàn)代碼保存自動(dòng)格式化功能
本文詳細(xì)介紹如何在QtCreator中設(shè)置代碼自動(dòng)保存格式化功能,通過配置ClangFormat和Beautifier工具,實(shí)現(xiàn)開發(fā)時(shí)專注邏輯化,保存時(shí)自動(dòng)美化,提升團(tuán)隊(duì)效率與代碼可讀性,需要的朋友可以參考下2026-06-06
C++使用libcurl輕松實(shí)現(xiàn)文件下載
這篇文章將用最簡單的方式,帶大家掌握C++ + libcurl實(shí)現(xiàn)文件下載的核心技術(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-08-08
Qt學(xué)習(xí)之QListWidget控件的使用教程詳解
這篇文章主要為大家詳細(xì)介紹了Qt中QListWidget控件的使用教程,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下2022-12-12
C++跳轉(zhuǎn)語句之Goto對(duì)變量定義的影響詳解
goto語句也被稱為無條件轉(zhuǎn)移語句,這篇文章主要介紹了C++跳轉(zhuǎn)語句之Goto對(duì)變量定義的影響,文中通過示例代碼解文字介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
C語言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法
這篇文章主要介紹了C語言中字符串與各數(shù)值類型之間的轉(zhuǎn)換方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

