当前位置:   article > 正文

时间编程ctime - C/C++_c++ ctime

c++ ctime

C++ 标准库没有提供所谓的日期类型。C++ 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime>头文件,对应的C语言头文件是<time.h>。

1. 函数与结构体整体概览

1.1. 函数概览

序号函数 & 描述
1

time_t time(time_t *time);
该函数返回系统的当前日历时间,自 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间,则返回 -1。

2

char *ctime(const time_t *time);
该返回一个表示当地时间的字符串指针,字符串形式 day month year hours:minutes:seconds year\n\0

3

struct tm *localtime(const time_t *time);
该函数返回一个指向表示本地时间的 tm 结构的指针。

4

clock_t clock(void);
该函数返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。如果时间不可用,则返回 -1。

5

char *asctime(const struct tm *time);
该函数返回一个指向字符串的指针,字符串包含了 time 所指向结构中存储的信息,返回形式为:day month date hours:minutes:seconds year\n\0。

6

struct tm *gmtime(const time_t *time);
该函数返回一个指向 time 的指针,time 为 tm 结构,用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。

7

time_t mktime(struct tm *time);
该函数返回日历时间,相当于 time 所指向结构中存储的时间。

8

double difftime(time_t time1, time_t time2);
该函数返回 time1 和 time2 之间相差的秒数。

9

size_t strftime();
该函数可用于格式化日期和时间为指定的格式。

1.2. 数据结构

  • 有四个与时间相关的类型:clock_t、time_t、size_t 和tm。
  • 类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数。

结构类型 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下:

  1. struct tm {
  2.   int tm_sec;     /* seconds after the minute - [0,59] */
  3.    int tm_min;     /* minutes after the hour - [0,59] */
  4.    int tm_hour;    /* hours since midnight - [0,23] */
  5.    int tm_mday;    /* day of the month - [1,31] */
  6.    int tm_mon;     /* months since January - [0,11] */
  7.    int tm_year;    /* years since 1900 */
  8.    int tm_wday;    /* days since Sunday - [0,6] */
  9.    int tm_yday;    /* days since January 1 - [0,365] */
  10.    int tm_isdst;   /* daylight savings time flag */
  11. };

【注意】结构体struct tm的年份是从1900年起至今多少年,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。

2. 基本时间处理函数

这一节主要是针对时间获取和之间格式转换函数进行说明。

2.1 time获取UTC秒数

C 库函数 time_t time(time_t *seconds) 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为NULL,则返回值也存储在变量 seconds 中。具体是否使用这个入参根据具体后期代码组合方便确定。

  1. #include <iostream>
  2. #include <ctime>
  3. int main(int argc, char** argv) {
  4. time_t nowTime;
  5. time_t *inputTime = new time_t;
  6. nowTime = time( inputTime );
  7. std::cout << "Return time seconds: " << nowTime << std::endl;
  8. std::cout << "Input time seconds: " << *inputTime << std::endl;
  9. delete(inputTime);
  10. return 0;
  11. }
  12. Return time seconds: 1651747293
  13. Input time seconds: 1651747293

2.2 time_t数据转换其他格式

数据转换这一块有如下这么几种方式进行:

  • ctime:直接针对输入的time_t结构数据转换成函数内部已经规定格式的字符串,如果对输出时间格式没有特定要求,这个函数简单易用。
  • gtime:将输入的time_t结构转换成UTC参考标准的tm_t结构,后期针对自己个人需要确定tm_t结果整理。可以按照自己特定需求格式进行数据组织,也可以直接根据自己需要只获取自己需要的变量
  • localtime:将输入的time_t时间转换成基于本地时间为参考标准的tm_t结构,后期根据需求进行数据组织
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <ctime>
  4. #define BST (+1)
  5. #define CCT (+8)
  6. int main(int argc, char** argv) {
  7. // 基于当前系统时间
  8. time_t now = time(NULL);
  9. char* dt = ctime(&now);
  10. printf("ctime本地时间%s", dt);
  11. // 把now转换成tm结构形式的GMT时间
  12. tm *info = gmtime(&now);
  13. printf("gtime本地时间\n");
  14. printf("伦敦%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min);
  15. printf("中国%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min);
  16. // 直接转换成当地时间
  17. tm *localinfo = localtime(&now);
  18. printf("localtime本地时间%2d:%02d\n", localinfo->tm_hour, localinfo->tm_min);
  19. // tm时间转换成UTC基准时间字符串
  20. dt = asctime(info);
  21. std::cout << "UTC ÈÕÆÚºÍʱ¼ä£º"<< dt << std::endl;
  22. // tm时间转换成特定的描述
  23. time_t convertNow = 0;
  24. convertNow = mktime(info);
  25. printf("Time时间%d,mktime时间%d。\n", now, convertNow) ;
  26. return 0;
  27. }

ctime本地时间:Fri May 06 09:47:12 2022
gtime当前的世界时钟:
伦敦: 2:47
中国: 9:47
localtime本地时间: 9:47
UTC 日期和时间:Fri May 06 09:47:12 2022

Time 时间:1651801632,mktime 时间1651801632。 

2.3 tm结构转换其他格式

  • asctime:将tm结构的数据转换成函数内部规定的格式的字符串,和ctime类似只是输入数据格式不同
  • mktime:将tm结构的数据转换成time_t类型的数据。同时这个函数还会根据输入数据自动调整输入参数tm中的tm_wday和tm_yday数据
  • strftime:将tm结构的数据按照函数指定的格式进行字符串格式化,类似于sprintf。
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <ctime>
  4. int main(int argc, char** argv) {
  5. time_t rawtime;
  6. struct tm * timeinfo;
  7. char buffer [80];
  8. time (&rawtime);
  9. timeinfo = localtime (&rawtime);
  10. strftime (buffer,80,"Now it's %I:%M%p.",timeinfo);
  11. puts (buffer);
  12. return 0;
  13. }

测试结果:Now it's 09:48AM. 

2.4. clock

返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。为了获取 CPU 所使用的秒数,您需要除以 CLOCKS_PER_SEC。在 32 位系统中,CLOCKS_PER_SEC 等于 1000000,该函数大约每 72 分钟会返回相同的值。

  1. /* clock example: frequency of primes */
  2. #include <stdio.h> /* printf */
  3. #include <time.h> /* clock_t, clock, CLOCKS_PER_SEC */
  4. #include <math.h> /* sqrt */
  5. int frequency_of_primes (int n) {
  6. int i,j;
  7. int freq=n-1;
  8. for (i=2; i<=n; ++i) for (j=sqrt(i);j>1;--j) if (i%j==0) {--freq; break;}
  9. return freq;
  10. }
  11. int main ()
  12. {
  13. clock_t t;
  14. int f;
  15. t = clock();
  16. printf ("Calculating...\n");
  17. f = frequency_of_primes (99999);
  18. printf ("The number of primes lower than 100,000 is: %d\n",f);
  19. t = clock() - t;
  20. printf ("It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);
  21. return 0;
  22. }

测试结果:

Calculating...
The number of primes lower than 100,000 is: 9592
It took me 51 clicks (0.051000 seconds).

2.6. difftime

  1. /* difftime example */
  2. #include <stdio.h> /* printf */
  3. #include <time.h> /* time_t, struct tm, difftime, time, mktime */
  4. int main ()
  5. {
  6. time_t now;
  7. struct tm newyear;
  8. double seconds;
  9. time(&now); /* get current time; same as: now = time(NULL) */
  10. newyear = *localtime(&now);
  11. newyear.tm_hour = 0; newyear.tm_min = 0; newyear.tm_sec = 0;
  12. newyear.tm_mon = 0; newyear.tm_mday = 1;
  13. seconds = difftime(now,mktime(&newyear));
  14. printf ("%.f seconds since new year in the current timezone.\n", seconds);
  15. return 0;
  16. }

输出结果:

3777291 seconds since new year in the current timezone.

3. 集成

实际在代码开发过程中,时间戳的产生和获取的时候会通过一个函数来封装特定格式时间,所以时间开发过程中通过特定的集成函数完成。

3.1. 系统当前时间戳获取

  1. #include <process.h>
  2. #include <string>
  3. #include <iostream>
  4. #include <ctime>
  5. using namespace std;
  6. /*******************************************************************
  7. * C++ 标准库没有提供所谓的日期类型。
  8. * C++ 继承了 C 语言用于日期和时间操作的结构和函数。
  9. * 为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件。
  10. *******************************************************************/
  11. std::string GetSystemTime()
  12. {
  13.     time_t tt;
  14.     struct tm *t;
  15.     tt = time(0);
  16.     t = localtime(&tt);
  17.     char char_time[50] = {};
  18.     sprintf(char_time, " %04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900,
  19.             t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
  20.     std::string str_system_time = static_cast<std::string>(char_time);
  21.     return str_system_time;
  22. }
  23. int main(void)
  24. {
  25.     std::string system_time = GetSystemTime();
  26.     std::cout << "current_system_time :" << system_time;
  27.     system("pause");
  28.     return 0;
  29. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/527872
推荐阅读
相关标签
  

闽ICP备14008679号