日期时间篇
asctime
将时间和日期以字符串格式表示
头文件
#include <time.h>
函数原型
char *asctime(const struct tm *tm);
说明:asctime() 将参数 tm 所指的 tm 结构体中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形式返回。此函数已经由时区转换成当地时间,字符串格式为 “Mon Apr 6 05:20:01 1992\n”。若再调用相关的时间日期函数,此字符串可能会被破坏。此函数与 ctime 不同之处在于传入的参数是不同的结构体。
返回值:返回一字符串表示目前当地的时间日期。
相关函数:time,ctime,gmtime,localtime
示例
#include <stdio.h>
#include <time.h>
int main()
{
time_t timep;
time(&timep);
printf("%s", asctime(gmtime(&timep)));
return 0;
}
执行
Sun Jun 20 05:01:21 2021
clock_gettime
将时间和日期以字符串格式表示
头文件
#include <time.h>
函数原型
int clock_gettime(clockid_t clk_id, struct timespec *tp);
说明:
返回值:
相关函数:time, date, gettimeofday
示例
#include <stdio.h>
#include <time.h>
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
{
/* handle error */
return -1;
}
ctime
将时间和日期以字符串格式表示
头文件
#include <time.h>
函数原型
char *ctime(const time_t *timep);
说明:ctime() 将参数 timep 所指的 time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形式返回。此函数已经由时区转换成当地时间,字符串格式为 “Mon Apr 6 05:20:01 1992\n”。若再调用相关的时间日期函数,此字符串可能会被破坏。
返回值:返回一字符串表示目前当地的时间日期。
相关函数:time,asctime,gmtime,localtime
示例
#include <stdio.h>
#include <time.h>
int main()
{
time_t timep;
time(&timep);
printf("%s", ctime(&timep));
return 0;
}
执行
Sun Jun 20 13:09:17 2021
gettimeofday
获取目前的时间
头文件
#include <sys/time.h>
函数原型
int gettimeofday(struct timeval *tv, struct timezone *tz);
说明:gettimeofday() 会把目前的时间由 tv 所指的结构返回,当地时区的信息则放到 tz 所指的结构中。
timeval 结构体定义:
struct timeval { long tv_sec; /* 秒 */ long tv_usec; /* 微秒 */ };
timezone 结构体定义:
struct timezone { int tz_minuteswest; /* 和格林尼治时间差了多少分钟 */ int tz_dsttime; /* 时间的修正方式 */ };
上述两个结构体都定义在 /usr/include/sys/time.h,其中 tz_dsttime 所代表的状态如下:
DST_NONE /* 不使用 */ DST_USA /* 美国 */ DST_AUST /* 澳洲 */ DST_WET /* 西欧 */ DST_MET /* 中欧 */ DST_EET /* 东欧 */ DST_CAN /* 加拿大 */ DST_GB /* 英国 */ DST_RUM /* 罗马尼亚 */ DST_TUR /* 土耳其 */ DST_AUSTALT /* 澳洲(1986年以后)*/
返回值:成功则返回 0,失败返回 -1,错误代码存于 errno。
附加说明:EFAULT 表示指针 tv 和 tz 所指的内存空间超出存取权限。
相关函数:time,ctime,ftime,settimeofday
示例
#include <stdio.h>
#include <sys/time.h>
int main()
{
struct timeval tv;
struct timezone tz;
gettimeofday(&tv, &tz);
printf("tv_sec: %ld\n", tv.tv_sec) ;
printf("tv_usec: %ld\n", tv.tv_usec);
printf("tz_minuteswest: %d\n", tz.tz_minuteswest);
printf("tz_dsttime: %d\n", tz.tz_dsttime);
return 0;
}
执行
tv_sec: 1624167233
tv_usec: 499533
tz_minuteswest: 0
tz_dsttime: 0
gmtime
获取目前的时间和日期
头文件
#include <time.h>
函数原型
struct tm *gmtime(const time_t *timep);
说明:gmtime() 将参数 timep 所指的 time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构 tm 返回。
结构体 tm 的定义为:
struct tm { int tm_sec; /* 代表目前秒数,正常范围为0-59,但允许至61秒 */ int tm_min; /* 代表目前分数,范围0-59 */ int tm_hour; /* 从午夜算起的时数,范围为0-23 */ int tm_mday; /* 目前月份的日数,范围01-31 */ int tm_mon; /* 代表目前月份,从一月算起,范围从0-11 */ int tm_year; /* 从1990年算起至今的年数 */ int tm_wday; /* 一星期的日数,从星期一算起,范围为0-6 */ int tm_yday; /* 从今年1月1日算起至今的天数,范围为0-365 */ int tm_isdst; /* 日光节约时间(夏令时)的标志 */ };
此函数返回的时间日期未经时区转换,而是 UTC 时间。
返回值:返回结构 tm 代表目前 UTC 时间。
相关函数:time,asctime,ctime,localtime
示例
#include <stdio.h>
#include <time.h>
int main()
{
char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
time_t timep;
struct tm *p;
time(&timep);
p = gmtime(&timep);
printf("%d-%02d-%02d ", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday);
printf("%s %02d:%02d:%02d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
return 0;
}
执行
2021-06-20 Sun 05:46:51
localtime
获取当地目前时间和日期
头文件
#include <time.h>
函数原型
struct tm *localtime(const time_t *timep);
说明:localtime() 将参数 timep 所指的 time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以 tm 结构体形式返回(结构体 tm 的定义请参考 gmtime)。此函数已经由时区转换成当地时间。
返回值:返回结构体 tm 代表目前的当地时间。
相关函数:time, asctime, ctime, gmtime
示例
#include <stdio.h>
#include <time.h>
int main()
{
char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
time_t timep;
struct tm *p;
time(&timep);
p = localtime(&timep); /* 获取当地时间 */
printf("%d-%02d-%02d ", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday);
printf("%s %02d:%02d:%02d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
return 0;
}
执行
2021-06-20 Sun 13:53:23
mktime
将时间结构数据转换成经过的秒数
头文件
#include <time.h>
函数原型
time_t mktime(struct tm *tm);
说明:mktime() 用来将参数 tm 所指的 tm 结构数据转换成从公元 1970年1月1日0时0分0秒算起至今的 UTC 时间所经过的秒数。
返回值:返回经过的秒数。
相关函数:time,asctime,gmtime,localtime
示例
/* 用 time()取得时间(秒数),利用 localtime() 转换成 struct tm
* 再利用 mktime() 将 struct tm 转换成原来的秒数
*/
#include <stdio.h>
#include <time.h>
int main()
{
time_t timep;
struct tm *p;
time(&timep);
printf("time() : %ld \n", timep);
p = localtime(&timep);
timep = mktime(p);
printf("time()->localtime()->mktime() : %ld\n", timep);
return 0;
}
执行
time() : 1624168857
time()->localtime()->mktime() : 1624168857
settimeofday
设置目前时间
头文件
#include <sys/time.h>
函数原型
int settimeofday(const struct timeval *tv, const struct timezone *tz);
说明:settimeofday() 会把目前时间设成由 tv 所指的结构信息,当地时区信息则设成 tz 所指的结构。详细的说明请参考 gettimeofday()。注意,只有 root 权限才能使用此函数修改时间。
返回值:成功则返回 0,失败返回 -1,错误代码存于 errno。错误代码如下:
EPERM
权限不够,并非由 root 权限调用 settimeofday();EINVAL
时区或某个数据是不正确的,无法正确设置时间。
附加说明:
相关函数:time,ctime,ftime,gettimeofday
time
获取目前的时间
头文件
#include <time.h>
函数原型
time_t time(time_t *tloc);
说明:此函数会返回从公元 1970年1月1日0时0分0秒算起至今的 UTC 时间所经过的秒数。如果 tloc 并非空指针的话,此函数也会将返回值存到 tloc 指针所指的内存。
返回值:成功则返回描述,失败则返回 ((time_t)-1) 值,错误原因存于 errno 中。
相关函数:ctime,ftime,gettimeofday
示例
#include <stdio.h>
#include <time.h>
int main()
{
int seconds = time((time_t*)NULL);
printf("%d\n", seconds);
return 0;
}
执行
1624169441