【linux编程】时间函数
几个时间概念
1:Coordinated Universal Time(UTC):
协调世界时,又称世界标准时间,也即格林威治标准时间(Greenwich Mean Time,GMT),中国内地的时间与UTC得时差为+8,也即UTC+8,美国为UTC-5。
2:Calendar Time:
日历时间,是用"从一个标准时间点到此时的时间经过的秒数"来表示的时间。标准时间点对不同编译器可能会不同,但对一个编译系统来说,标准时间是不变的。一般是表示距离UTC时间 1970-01-01 00:00:00的秒数。
3:epoch:
时间点。在标准c/c++中是一个整数,用此时的时间和标准时间点相差的秒数(即日历时间)来表示。
4:clock tick:
时钟计时单元(而不叫做时钟滴答次数),一个时钟计时单元的时间长短是由cpu控制的,一个clock tick不是cpu的一个时钟周期,而是c/c++的一个基本计时单位。
time.h 的定义
time.h 头文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。
4个变量
size_t | 是无符号整数类型,它是 sizeof 关键字的结果。 |
---|---|
clock_t | 这是一个适合存储处理器时间的类型,类型为unsigned long |
time_t | 这是一个适合存储日历时间类型。 |
struct tm | 这是一个用来保存时间和日期的结构。 |
tm 结构的定义如下:
struct tm { int tm_sec; /* 秒,范围从 0 到 59 */ int tm_min; /* 分,范围从 0 到 59 */ int tm_hour; /* 小时,范围从 0 到 23 */ int tm_mday; /* 一月中的第几天,范围从 1 到 31 */ int tm_mon; /* 月,范围从 0 到 11(注意) */ int tm_year; /* 自 1900 年起的年数 */ int tm_wday; /* 一周中的第几天,范围从 0 到 6 */ int tm_yday; /* 一年中的第几天,范围从 0 到 365 */ int tm_isdst; /* 夏令时 */ long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/ const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/ };
一个宏:
NULL | 这个宏是一个空指针常量的值。 |
---|---|
CLOCKS_PER_SEC | 这个宏表示每秒的处理器时钟个数。用于将clock()函数的结果转化为以秒为单位的量,这个量的具体值是与操作系统相关的,通常为1000。 |
库函数
1:clock函数
函数原型: clock_t clock(void)
函数返回:返回clock函数执行起(一般为程序的开头),处理器时钟所使用的时间。
函数功能:用来计算程序或程序的某一段的执行时间。
1 #include <stdio.h> 2 #include <time.h> 3 4 int main() { 5 long long sum = 0; 6 clock_t start_t, finish_t; 7 double total_t = 0; 8 int i = 0; 9 start_t = clock(); 10 for (; i <= 100000; ++i) { 11 sum += i; 12 } 13 finish_t = clock(); 14 total_t = (double)(finish_t - start_t) / CLOCKS_PER_SEC;//将时间转换为秒 15 16 printf("CPU 占用的总时间:%f\n", total_t); 17 return 0; 18 }
输出:
CPU 占用的总时间:0.000337
time函数
函数原型:
time_t time(time_t *timer)
参数说明: timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数),time_t是一个unsigned long类型。如果 timer不为空,则返回值也存储在变量 timer中。
函数功能: 得到当前日历时间或者设置日历时间
函数返回: 当前日历时间
1 #include <stdio.h> 2 #include <time.h> 3 4 int main() 5 { 6 time_t seconds; 7 8 seconds = time(NULL); 9 printf("自 1970-01-01 起的小时数 = %ld\n", seconds / 3600); 10 11 return 0; 12 }
gtime函数
函数原型:
struct tm *gmtime(const time_t *timer)
函数功能:C 库函数 struct tm *gmtime(const time_t *timer) 使用 timer 的值来填充 tm 结构,并用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。
将日历时间转换成协调统一时间的年、月、日、时、分、秒等分解结构。
返回值:该函数返回指向 tm 结构的指针,该结构带有被填充的时间信息。
1. 示例
1 #include <stdio.h> 2 #include <time.h> 3 4 #define BST (+1) 5 #define CCT (+8) 6 7 int main() 8 { 9 10 time_t rawtime; 11 struct tm *info; 12 13 time(&rawtime); 14 /* 获取 GMT 时间 */ 15 info = gmtime(&rawtime); 16 17 printf("当前的世界时钟:\n"); 18 printf("伦敦:%2d:%02d\n", (info->tm_hour + BST) % 24, info->tm_min); 19 printf("中国:%2d:%02d\n", (info->tm_hour + CCT) % 24, info->tm_min); 20 21 return 0; 22 }
输出:
当前的世界时钟: 伦敦:14:28 中国:21:28
asctime函数
函数原型:
char* asctime(struct tm * ptr)
函数功能:将结构struct tm * ptr所表示的时间以字符串表示
函数返回: 返回的时间字符串格式为:星期,月,日,小时:分:秒,年。
1.示例
1 #include <stdio.h> 2 #include <time.h> 3 4 int main() 5 { 6 struct tm t; //更多情况下是通过localtime函数及gmtime函数获得tm结构 7 8 t.tm_sec = 10; 9 t.tm_min = 10; 10 t.tm_hour = 6; 11 t.tm_mday = 25; 12 t.tm_mon = 2; 13 t.tm_year = 89; 14 t.tm_wday = 6; 15 16 printf("%s\n", asctime(&t)); 17 18 return (0); 19 }
输出结果:
Sat Mar 25 06:10:10 1989
localtime函数
函数原型:
struct tm *localtime(const time_t *timer)
函数功能: localtime将日历时间转换成本地时间(考虑到本地时区和夏令时标志)。
函数返回: 以tm结构表达的时间。
1. 示例
1 #include <stdio.h> 2 #include <time.h> 3 4 int main() 5 { 6 time_t timer; 7 struct tm *now; 8 9 time(&timer); 10 now = localtime(&timer); 11 printf("当前的本地时间和日期:%s", asctime(now)); 12 return 0; 13 }
输出:
当前的本地时间和日期:Tue Oct 19 21:31:53 2021
mktime函数
函数原型:
time_t mktime(struct tm *timeptr)
函数功能:mktime()用来将本地时间参数timeptr 所指的tm 结构数据转换成从公元1970 年1 月1 日0 时0 分0 秒算起至今的UTC 时间所经过的秒数。
返回值:返回经过的秒数。
这是指向表示日历时间的 time_t 值的指针,该日历时间被分解为以下各部分。下面是 timeptr 结构的细节:
1. 示例
1 #include <time.h> 2 #include <stdio.h> 3 4 int main() 5 { 6 time_t timep; 7 struct tm *p; 8 time(&timep); 9 printf("time() : %d\n", timep); 10 p = localtime(&timep); 11 timep = mktime(p); 12 printf("time()->localtime()->mktime():%d\n", timep); 13 }
输出:
time() : 1634649761 time()->localtime()->mktime():1634649761
2. 示例
1 #include <stdio.h> 2 #include <time.h> 3 #include <iostream> 4 using namespace std; 5 6 void dump(std::string msg, struct tm* p) 7 { 8 std::cout << msg << std::endl; 9 std::cout << "tm_sec: " << p->tm_sec << std::endl; 10 std::cout << "tm_min: " << p->tm_min << std::endl; 11 std::cout << "tm_hour: " << p->tm_hour << std::endl; 12 std::cout << "tm_mday: " << p->tm_mday << std::endl; 13 std::cout << "tm_mon: " << p->tm_mon << std::endl; 14 std::cout << "tm_year: " << p->tm_yday << std::endl; 15 std::cout << "tm_wday: " << p->tm_wday << std::endl; 16 std::cout << "tm_yday: " << p->tm_yday << std::endl; 17 std::cout << "tm_isdst: " << p->tm_isdst << std::endl; 18 std::cout << "tm_zone: " << p->tm_zone << std::endl; 19 } 20 21 int main() 22 { 23 time_t timep; 24 time(&timep); 25 26 dump("gmtime:", gmtime(&timep)); 27 dump("localtime:", localtime(&timep)); 28 29 return 0; 30 }
输出:
gmtime: tm_sec: 22 tm_min: 38 tm_hour: 14 tm_mday: 19 tm_mon: 9 tm_year: 291 tm_wday: 2 tm_yday: 291 tm_isdst: 0 tm_zone: GMT localtime: tm_sec: 22 tm_min: 38 tm_hour: 22 tm_mday: 19 tm_mon: 9 tm_year: 291 tm_wday: 2 tm_yday: 291 tm_isdst: 0 tm_zone: CST
strftime函数与strftime_l函数
说明符 | 替换为 | 实例 |
---|---|---|
%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 |
%% | 一个 % 符号 | % |
1. 示例
1 #include <stdio.h> 2 #include <time.h> 3 4 int main() 5 { 6 time_t rawtime; 7 struct tm *info; 8 char buffer[80]; 9 10 time(&rawtime); 11 12 info = localtime(&rawtime); 13 14 strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info); 15 printf("格式化的日期 & 时间 : |%s|\n", buffer); //本地时间 16 17 return 0; 18 }
输出:
格式化的日期 & 时间 : |2021-10-19 21:37:12|
strptime函数
函数原型:
char *strptime(const char *s, const char *format, struct tm *tm);
函数功能:trptime() 函数解析由 strftime() 生成的时间/日期。
参数:s:字符串指针,用来接收tm结构体中的时间;format:格式化字符串;tm:时间结构体
函数返回值:指向上次解析的字符的下一个字符的指针;否者,返回NULL
1. 示例
1 #include <stdio.h> 2 #include <time.h> 3 4 int main() 5 { 6 struct tm tm; 7 char buf[255]; 8 9 strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm); 10 strftime(buf, sizeof(buf), "%d %b %Y %H:%M", &tm); 11 12 puts(buf); 13 return 0; 14 }
输出:
12 Nov 2001 18:31
【注意】localtime、mktime、和strftime函数受环境变量TZ的影响,如果定义了TZ, 则这些函数使用其值代替系统默认的时间,如果TZ定义为空串(即TZ=), 则使用世界协调统一时间UTC。