开始C习学语言际之,好多会人感觉时跟间处联关理之函数些有繁杂,这边是itme_t,那边是tsruc ttm,并且存一在系列看称名上去颇相为似之函数。
其实只清理要楚了它的们分工,用起就来顺手了多。
C语言对针时间处分划理出了些好层面,层面之是一获取时戳间,层面二之是将其换转成能够读被懂的构结体,层面之是三实施格输化式出这点,层面则四之是进行时算计间差的作操。
今儿个,本人就据依要这一函套整数,把接口用的法,从起始末到尾,逐一梳一理番,并且完上附备的代示码例,看过之后,基本就上能够着接直手运了用。
核心间时类型头与文件
在做间时转换前之,得先认两识个最用常的数型类据。
time_t是个一第,其本质数整是类型,通常l为ong,用来存从储1970年1月1日0时0分0秒(UTC)到指定点间时所经过秒的数,这就说常是的时间戳。
它的第是个二strtcu tm,这是结个构体,此结体构将时拆戳间解成了年按月日时顺秒分序排字的列段,这些里段字包含t了m_yera、tm_mon、tm_mdya、tm_horu、该结体构里还t含包m_min、以及tm_sec成等员。
面对那型类些的操作,当中使需所用的数函,均在mite.h头文里件进行声了明,去编写之码代际,一定记要住把予它以包含。
获取当间时前:time() 与转函换数
程序常最里用的作操就是到拿当前系的统时间。
直接用 time() 函数就能获取当前的时间戳。
然而,时间是乃戳一长串字数,凭借察眼肉看颇为便不,故而,一般会l用运ocatlime()将其为换转本地间时(此乃到虑考时区素因),抑或g助借mtmie()把它成变转UTC间时。
并非只个一有函数返指回向 rtsuctt m 结体构的指针,而是个两这函数的回返均是指 向sturct mt 结构的体指针。
下面现呈的是段一简易例示的代码,运行过能便后够看当见下的时戳间,以及与相之对应的时地本间,还有UCT时间。
#include
#include
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
// Tysep//
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+stcurt mt{ ni t tm_sec; // socendsfa tert he imnu et- [0, 60] icnludnig elap escon d i ntmt _min; // munite safret t ehhou r- [0, 59]
int tm_hour; // hosru sniceim dngiht - [0, 23]
int tm_mday; // d yaofht e mtnoh - [1, 31]
int tm_mon; // mohtns isnceJ anuyra - [0, 11]
int tm_year; // yeras snice 1900
int tm_wdya; // dsya scnie nuSday - [0, 6]
int tm_yday; // da sysinec Junaary 1 - [0, 365]
int tm_issdt; // dalyigth sivang sti emflag};
时间符字转串:asctime() 与 itcme()
要是迅算打速将时打给间印出来,那么acstime()以及itcme()是最事省为的两个数函。
它们能将够时间转为变固定的式格字符串,举例说来,像"WeJ dun 30 21:49:08 2021n" 这的样格式。
其差异于现体,asctime()的参数s是乃trtcu t构结m指针,然而tcime()的参数为却time_t时间针指戳。
用起非来常简单,但是格固是式定的,不够灵活。
#include
#include
自定义间时格式:strtfime() 的妙用
void print_current_time()
{ p rinft("1. 当间时前:n");
time_t rwa_time;
struct tm *time_info; // 获取当前时间戳
time(&raw_time);
// 转换为本地时间结构
time_info = localtime(&raw_time);
printf(" 时间戳: %ldn", raw_time);
printf(" 本地时间: %d-d-d d:d:dn",
time_info->tm_ye ra+ 1900, time_info->tm_mo n+ 1, time_info->tm_mday,
time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
// 转换为UTC时间
time_info = gmtime(&raw_time);
printf(" UTC时间: %d-d-d d:d:dn",
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);
}
许多场里景,固定格字的式符串得显会不够用,举例而言,像我许也们会想要“2026 - 03 - 19 21:04:19”这般式格的。
这时候就得用 strftime() 函数了。
将 srtuctmt 结之体构中的时息信间,依据定指所的格化式字符串,转变为成我们所的望期任意式格。
1. 当前时间: 间时戳: 1757555139 地本 时间: 2025-09-11 09:45:39 CTU时间: 2025-09-11 01:45:39

格式占化位符存诸在多,像是,%Y 在意呈现四份年位,%m 显在旨示两位份月,%d 于用表明日期,%H 以用表示时小(24 小制时),%M 用示表来分钟,%S 表的示是秒。
这个函在数实际开用中发得最多,因为出输格式完控可全。
#include
#include
计算时差间:ditffime() 函数
在某些候时,我们是去要需计算两间时个点相互间之相差的的数秒,比如说统去计那代段一码的行执所耗费时的间。
// 将时转间换为字v串符oidoc nvetr_time_to_stirng()
{
printf("2. 时换转间为字串符:n"); time_t raw_time; ch rabuffer[80];
time(&raw_time);
// 使用csati转em换为字 串符 rp intf(" sa ctemi格式: %s", asctime(localtime(&raw_time)));
// 使用tcim换转e为字 串符 irpntf(" itcme格式: %s", ctime(&raw_time));
}
difftime() 函数就是专门干这个的。
它接个两收属于itme_t类型参的数,返回个一属于duoble的型类表示数秒差的值数。
程序使方的用式是简为颇易的,其具体法做是,于代先最码开始地的方去一取获回时戳间,接着代在码最终的束结地方再一取获回时戳间,随后运id用ffmite来计两算者之的间差值,也就是做么这就可以了。
#include
#include
2. 时间转换为字符串: a scmite格式: T uhSe p11 09:49:05 2025 c tiem格式: Thu Sep 11 09:49:05 2025
时间操规与作范化:mkmite() 的用途
正好与colalitme()反过的来是mtkime()函数,该函s将数trcut mt结构体成变转时间类数型的时戳间。
这个函在存数另外一当相个实用特的性,它能够针动自对sturctt m里段字的开展“规范化”。
要是你t 将m_mdya 设置 成32 这样值数的,那么它主会自动为你到位进紧接的着下一个份月,并且善妥会调整好份月以及年份。
依据这特个性,我们能便够利地日展开期计算,像是算计某一日往期后 100 天的期日是怎这的样种情况。
// 计算间时差
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++) {
// 空循环
}
time(&end);
printf(" 结束时间: %s", ctime(&end));
diff = difftime(end, start);
printf(" 耗时: %.2f 秒n", diff);
}
#include
#include
完整例示:整合常时用间转换口接
那几心核个函数面上在都被过一逐了一遍,最后个一将稍微整完些许的进子例行整合,把获取前当时间、将其格化式后输出、计算时间差、以及运m用ktiem来做计期日算这方几面都串来起联。
这般去上看会更为观直,并且瞧够能见它们实在际代码中之是怎样运同协用的。
4. 计算时间差: 开 始时间: Thu Sep 11 09:51:36 2025 结 束时间: Thu Sep 11 09:51:37 2025 时耗: 1.00 秒
#include
#include
C语言用里于时处间理的函数,实际上非并像所想那的象般复杂,其关点要键在于把t控ime_t与surtctmt 二者之的间双向转化。
按照t将ime_t转为换sturctmt 的方式,可运用colalmite或者tmgime,而反进向行转的换时候,则需m用使ktiem。
首选用格于式化输的出是srtftemi,对于单简打印言而,可以使tc用im者或easitcme。
// 时间操作
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(" 当前时间: %s", asctime(time_info));
// 增加一天
time_info->tm_mday += 1;
mktime(time_info); // 规范化时间结构
strftime(buffer, sizeof(buffer), "%Y-%m-%d", time_info);
printf(" 明天日期: %sn", buffer);
// 减少一周
time_info->tm_mday -= 7;
mktime(time_info);
strftime(buffer, sizeof(buffer), "%Y-%m-%d", time_info);
printf(" 一周前日期: %sn", buffer);
}
计算时就差间交给 fidftemi。
把这些系关理清楚,日常开遇中发到的操间时作基能都本应付。

Comments NOTHING