文章目录
一些基本概念
开始时间
linux时间从1970年1月1日开始计数,记录从1970年1月1日开始到现在的秒数。
什么是UTC
UTC是世界标准时间。UTC是目前主要的世界时间标准,广泛应用在航空、天气预报、同步计算机时钟等各领域。需要注意的是中国内地的时间与UTC的时为+8,也就是UTC+8。美国为UTC-5
struct tm 结构中的成员
struct tm
{
int tm_sec; //分后的秒(0~61)
int tm_min; //小时后的分(0~59)
int tm_hour; //小时(0~23)
int tm_mday; //一个月天数(0~31)
int tm_mon; //一个后的月数(0~11)
int tm_year; //1900年后的年数 Year - 1900.
int tm_wday; //星期日开始的天数(0~6)
int tm_yday; //从1月1日开始的时间(0~365)
int tm_isdst; //夏令时标志(大于0:夏令时有效,等于0:无效,小于0:信息不可用)
};
带有结构struct tm中的时间函数
time_t mktime(struct tm* tmptr);//把tmptr指向的结构中的分解时间转换成日历时间
char *asctime(const struct tm *tmpt)//把tmpt指向的结构中的分解时间转换成 Thu Feb 26 13:14:13 1998\n\0格式的字符串
struct tm *gmtime(const time_t *ptm);//把ptm指向的日历时间转换成协调世界时(UTC)表示的分解时间,返回一个指向结构的指针,该结构中储时间信息
struct tm *locatime(const time_t *ptm);//把ptm指向的日历时间转换成本地时间表示的分解时间
time_t
time_t类型通常是一个大整数值,该整数值表示自UTC时间1970年1月1日00:00以来经过的秒数即UNIX时间戳,可直接调用time函数获取
time
函数原型
time_t time(time_t *timer);
参数
timer:指向 time_t 类型的变量,用来存放时间值。参数 timer 的值可以为 NULL,time() 函数仍然会将当前的系统时间作为返回值
返回值
返回当前的系统时间(秒数);如果执行失败,函数返回 -1
若参数 timer 不为 NULL,则函数的返回值和参数 timer 所指变量中存储的时间值是相同的
作用
获取当前的系统时间,通常是自 1970 年 1 月 1 日(UTC)以来的秒数
代码示例
#include <stdio.h>
#include <time.h>
int main ()
{
int ret;
time_t rawtime;
ret = time(&rawtime);
printf("rawtime = %ld\n", rawtime);
printf("ret = %d\n", ret);
return(0);
}
执行结果
gettimeofday
函数原型
int gettimeofday(struct timeval*tv,struct timezone *tz );
作用
tv.tv_sec的值和time函数返回的值是一样的,区别是gettimeofday更精确一些
可以精确到微秒,在测试程序代码执行时间上用的比较多
gettimeofday()函数的头文件为 #include <sys/time.h> 写成#include <time.h>报错
gettimeofday()我们一般写成gettimeofday(&tv,NULL);因为我们不想知道2参的情况
clock_gettime()函数,与gettimeofday类似,但精确度到更高,可以精确到纳秒
代码示例
#include <stdio.h>
#include <sys/time.h>
int main ()
{
int ret;
time_t rawtime;
struct timeval tv;
struct timezone tz;
time(&rawtime);
printf("rawtime = %ld\n", rawtime);
gettimeofday(&tv,&tz);
printf("tv_sec = %d\n",tv.tv_sec);
printf("tv_usec = %d\n",tv.tv_usec);
printf("tz_minuteswest = %d\n",tz.tz_minuteswest);
printf("tz_dsttime = %d\n",tz.tz_dsttime);
return(0);
}
执行结果
gmtime
函数原型
struct tm * gmtime (const time_t * timer);
接收一个time_t的const指针类型,返回类型为tm的结构体指针
作用
由此可见此函数主要做的就是将大整数值rawtime转换成易读取的时间,如可快速获取年、月、日等
gmtime将time_t转换为UTC时间
代码示例
#include <stdio.h>
#include <time.h> // time_t 、struct tm
#define BST (+1)
#define CCT (+8)
int main(int argc, char const *argv[])
{
time_t rawtime;
struct tm *info;
time(&rawtime);
// 获取 GMT 时间
info = gmtime(&rawtime);
printf("UTC: %2d:%02d\n", (info->tm_hour)%24, info->tm_min);
printf("伦敦:%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min);
printf("中国:%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min);
return(0);
}
执行结果
localtime
函数原型
struct tm *locatime(const time_t *timer);
接收一个time_t的const指针类型,返回类型为tm的结构体指针
作用
此函数功能和gmtime一致,只是localtime将time_t转换为本地时间(local time)
代码示例
#include <stdio.h>
#include <time.h> // time_t 、struct tm
int main(int argc, char const *argv[])
{
time_t rawtime;
struct tm *info;
time(&rawtime);
info = localtime(&rawtime);
printf("LOCAL: %d-%d-%d %2d:%02d:%02d\n", info->tm_year+1900, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec);
return(0);
}
执行结果
mktime
函数原型
time_t mktime(struct tm *timeptr)
作用
把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数
与gmtime相反
代码示例
#include <stdio.h>
#include <time.h>
int main ()
{
int ret;
time_t rawtime;
struct tm* info;
time(&rawtime);
printf("rawtime = %ld\n",rawtime);
info = gmtime(&rawtime);
printf("UTC: %d-%d-%d %2d:%02d:%02d\n", info->tm_year+1900, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min);
ret = mktime(info);
if( ret > 0 )
{
printf("ret = %d\n",ret);
}
info = localtime(&rawtime);
printf("LOCAL: %d-%d-%d %2d:%02d:%02d\n", info->tm_year+1900, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec);
ret = mktime(info);
if( ret > 0 )
{
printf("ret = %d\n",ret);
}
return(0);
}
执行结果
问题
它和local是相反的,不应该和UTC时间相反?
asctime
函数原型
char* asctime(struct tm * ptr);
参数
结构指针ptr应通过函数localtime()或gmtime()得到
返回值
返回的时间字符串格式为:星期,月,日,小时:分:秒,年
作用
将结构struct tm * ptr所表示的时间以字符串表示
代码示例
#include <stdio.h>
#include <time.h>
int main ()
{
int ret;
time_t rawtime;
struct tm* info;
char *str = NULL;
time(&rawtime);
info = localtime(&rawtime);
str = asctime(info);
printf("%s\n",str);
return(0);
}
执行结果
ctime
函数原型
char *ctime(const time_t *timeval);
作用
ctime以原始时间值为参数,并将其转换为一个更易读的本地时间
代码示例
#include <stdio.h>
#include <time.h>
int main ()
{
int ret;
time_t rawtime;
struct tm* info;
char *str = NULL;
time(&rawtime);
str = ctime(&rawtime);
printf("%s\n",str);
return(0);
}
执行结果
strftime
函数原型
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
作用
根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中
参数
说明符 | 替换为 | 实例 |
---|---|---|
%a | 缩写的星期几名称 | Sun |
%A | 完整的星期几名称 | Sunday |
%b | 缩写的月份名称 | Mar |
%B | 完整的月份名称 | March |
%c | 日期和时间表示法 | Sun Aug 19 02:56:02 2012 |
%d | 一月中的第几天(01-31) | 19 |
%H | 24 小时格式的小时(00-23) | 14 |
%I | 12 小时格式的小时(01-12) | 05 |
%j | 一年中的第几天(001-366) | 231 |
%m | 十进制数表示的月份(01-12) | 08 |
%M | 分(00-59) | 55 |
%p | AM 或 PM 名称 | PM |
%S | 秒(00-61) | 02 |
%U | 一年中的第几周,以第一个星期日作为第一周的第一天(00-53) | 33 |
%w | 十进制数表示的星期几,星期日表示为 0(0-6) | 4 |
%W | 一年中的第几周,以第一个星期一作为第一周的第一天(00-53) | 34 |
%x | 日期表示法 | 08/19/12 |
%X | 时间表示法 | 02:50:06 |
%y | 年份,最后两个数字(00-99) | 01 |
%Y | 年份 | 2012 |
%Z | 时区的名称或缩写 | CDT |
%% | 一个 % 符号 | % |
代码示例
#include <stdio.h>
#include <time.h>
int main ()
{
int ret;
time_t rawtime;
struct tm* info;
char buffer[80];
time(&rawtime);
info = localtime(&rawtime);
strftime(buffer,sizeof(buffer),"Now is %Y/%m/%d %H:%M:%S",info);
printf("%s\n", buffer);
strftime(buffer,sizeof(buffer),"%c %A %j %Z",info);
printf("%s\n", buffer);
return(0);
}
执行结果
difftime
函数原型
double difftime(time_t time1,time_t time2);
作用
返回time1和time2之间相差的秒数(time1-time2)
参数
time1,这是表示结束时间的time_t对象
time2,这是表示开始时间的time_t对象
返回值
该函数返回值以双精度浮点型double值表示的两个时间之间相差的秒数(time2-time1)
代码示例
#include <stdio.h>
#include <time.h>
int main()
{
time_t start_t,end_t;
double diff_t;
printf("start\n");
time(&start_t);
printf("sleep 5s\n");
sleep(5);
time(&end_t);
diff_t=difftime(end_t,start_t);
printf("run time = %f\n",diff_t);
return (0);
}
执行结果
参考链接
CSDN-linux系统函数之mktime
菜鸟教程-mktime
菜鸟教程-strftime
CSDN-c语言中获取当前时间的函数
C 语言中的 time 函数总结
CSDN-Linux —— 时间问题(GMT,UTC,DST,CST,CET表示什么、UTC与CST之间的转换)
其他参考的博客未列出
时间戳转换工具