【C/C++】获取当前系统时间(time_t和tm)清晰梳理_c++ time_t_YuXi_0520的博客-CSDN博客
C++ 获取系统当前时间
c++ time函数_C++的日期和时间函数
获取系统当前时间实例
大体思路
具体使用与解析
四、回顾与梳理
c++ time函数_C++的日期和时间函数
C++ 标准库没有提供所谓的日期类型。C++ 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用
有四个与时间相关的类型:clock_t、time_t、size_t 和tm。
类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数。
结构类型 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下:
#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
};
#define _TM_DEFINED
#endif /* _TM_DEFINED */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
【注意】结构体struct tm的年份是从1900年起至今多少年,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。
下面是 C/C++ 中关于日期和时间的重要函数。所有这些函数都是 C/C++ 标准库的组成部分,您可以在 C++ 标准库中查看一下各个函数的细节。
序号函数 描述
time_t time(time_t *time); 该函数返回系统的当前日历时间,自 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间,则返回 .1。
char *ctime(const time_t *time); 该返回一个表示当地时间的字符串指针,字符串形式 day month year hours:minutes:seconds year/n/0。
struct tm *localtime(const time_t *time); 该函数返回一个指向表示本地时间的 tm 结构的指针。
clock_t clock(void); 该函数返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。如果时间不可用,则返回 .1。
char * asctime ( const struct tm * time ); 该函数返回一个指向字符串的指针,字符串包含了 time 所指向结构中存储的信息,返回形式为:day month date hours:minutes:seconds year/n/0。
struct tm *gmtime(const time_t *time); 该函数返回一个指向 time 的指针,time 为 tm 结构,用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。
time_t mktime(struct tm *time); 该函数返回日历时间,相当于 time 所指向结构中存储的时间。
double difftime ( time_t time2, time_t time1 ); 该函数返回 time1 和 time2 之间相差的秒数。
size_t strftime(); 该函数可用于格式化日期和时间为指定的格式。
当前日期和时间
下面的实例获取当前系统的日期和时间,包括本地时间和协调世界时(UTC)。
#include
#include
using namespace std;
int main( )
{
// 基于当前系统的当前日期/时间
time_t now = time(0); // 把 now 转换为字符串形式
char* dt = ctime(&now); cout << "本地日期和时间:" << dt << endl;
// 把 now 转换为 tm 结构
tm *gmtm = gmtime(&now); dt = asctime(gmtm);
std::cout << "UTC 日期和时间:"<< dt << std::endl;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
当上面的代码被编译和执行时,它会产生下列结果:
本地日期和时间:Sat Jan 8 20:07:41 2011 UTC 日期和时间:Sun Jan 9 03:07:41 2011
使用结构 tm 格式化时间
tm 结构在 C/C++ 中处理日期和时间相关的操作时,显得尤为重要。tm 结构以 C 结构的形式保存日期和时间。大多数与时间相关的函数都使用了 tm 结构。下面的实例使用了 tm 结构和各种与日期和时间相关的函数。
在练习使用结构之前,需要对 C 结构有基本的了解,并懂得如何使用箭头 -> 运算符来访问结构成员。
#include
#include
using namespace std;
int main( ) {
// 基于当前系统的当前日期/时间
time_t now = time(0);
std::cout << "1970 到目前经过秒数:" << now << std::endl;
tm *ltm = localtime(&now);
// 输出 tm 结构的各个组成部分
std::cout << "年: "<< 1900 + ltm->tm_year << std::endl;
std::cout << "月: "<< 1 + ltm->tm_mon<< std::endl;
std::cout << "日: "<< ltm->tm_mday << std::endl;
std::cout << "时间: "<< ltm->tm_hour << ":";
std::cout << ltm->tm_min << ":";
cout << ltm->tm_sec << endl;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
当上面的代码被编译和执行时,它会产生下列结果:
1970 到目前时间:1503564157 年: 2017 月: 8 日: 24 时间: 16:42:37
———————————————
版权声明:本文为CSDN博主「邪王真眼小埋粉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:link
获取系统当前时间实例
方法①
#include
#include
#include
#include
using namespace std;
/*******************************************************************
* C++ 标准库没有提供所谓的日期类型。
* C++ 继承了 C 语言用于日期和时间操作的结构和函数。
* 为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用
*******************************************************************/
std::string GetSystemTime()
{
time_t tt;
struct tm *t;
tt = time(0);
t = localtime(&tt);
char char_time[50] = {};
sprintf(char_time, " %04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900,
t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
std::string str_system_time = static_cast
return str_system_time;
}
int main(void)
{
std::string system_time = GetSystemTime();
std::cout << "current_system_time :" << system_time;
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
编译时会出现以下错误:在这里插入图片描述
Error 1 error C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\users\ntf\documents\visual studio 2013\projects\demotest\getsystemtime\getsystemtime.cpp 19 1 GetSystemTime
1
解决办法:在预处理器中使用 _CRT_SECURE_NO_WARNINGS
CRT函数(C Runtime Library = C运行时间库)函数,是微软公司对C/C++语言的扩展。CRT函数就是标准的C语言函数。例如,printf、scanf、strlen、fopen等函数就属于CRT函数
在这里插入图片描述
方法②
按字符串输出,格式已规定好,不可自己改变格式
格式:Thu May 11 13:58:26 2021
#include
#include
#include
int main()
{
time_t timep;
time(&timep); //获取从1970至今过了多少秒,存入time_t类型的timep
printf("%s", ctime(&timep));//用ctime将秒数转化成字符串格式,输出:Thu May 11 13:58:26 2021
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
方法③
用stuct tm结构体,可自己改变格式
输出:2021/5/11 14:04:44
#include
#include
#include
int main()
{
time_t timep;
struct tm *p;
time(&timep); //获取从1970至今过了多少秒,存入time_t类型的timep
p = localtime(&timep);//用localtime将秒数转化为struct tm结构体
printf("%d/%d/%d %02d:%02d:%02d\n", 1900 + p->tm_year, 1 + p->tm_mon,
p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);//2021/5/11 14:04:44
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
若需要输出星期
#include
#include
#include
int main()
{
time_t timep;
struct tm *p;
time(&timep); //获取从1970至今过了多少秒,存入time_t类型的timep
p = localtime(&timep);//用localtime将秒数转化为struct tm结构体
char *wday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
printf("%s", wday[p->tm_wday]);//Thu
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
方法④
效果和方法②相同,按字符串输出,格式已规定好,不可自己改变格式
格式:Tue May 11 14:10:58 2021
#include
#include
#include
int main()
{
time_t timep;
time(&timep); //获取从1970至今过了多少秒,存入time_t类型的timep
//用localtime将秒数转化为struct tm结构体,再用asctime将结构体转化成字符串格式
printf("%s", asctime(localtime(&timep)));// Tue May 11 14:10:58 2021
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
大体思路
需要头文件#include
在计算机中看到的utc时间都是从(1970年01月01日 0:00:00)开始计算秒数的。
我们可以通过函数time()来获取从1970年到现在经过了多少秒,并定义time_t 这种类型(本质上是长整型long)来存储从1970年到现在经过了多少秒。
现在我们有了1970年至今的秒数了,但是我们是无法直接通过秒数看出当前的年月日的,所以需要用函数进行转化。(比如直接告诉你现在距离1970年过了1551193610秒,你是不知道今天几号的,得通过函数转化成“Tue May 11 14:10:58 2021”这种形式)
这里用于转化的函数,我们暂且称之为时间函数,它们有很多。
我们按照输出参数类型进行分类,一共有两种:
第一种是直接输出字符指针类型,这种函数的好处是可以直接打印字符串(输出如 :Tue Feb 26 20:32:53 2019),但是它的缺点是无法按照想要的格式输出。
第二种函数是输出struct tm结构体类型指针,这种结构体中分别定义了年月日时分秒等,我们可以利用它输出成我们想要的格式(如:2019/2/26 21:01:38)。
【这是我的理解,我感觉有些博文中说的有两种储存方式会略显凌乱,那样子可能会误以为不用定义time_t也可以直接通过struct tm来读取日期,而事实上并不能。我觉得time_t类型和struct tm结构体之间的关系应该如上所述,time_t是用来存放1970至今的秒数的一个长整型而已,存放下来的秒数可以通过各种时间函数来转化成struct tm结构体指针,方便格式化输出,这样子就比较清晰了。】
具体使用与解析
1、定义time_t类型变量,用来存储1970至今的秒数
本质上time_t是长整型,我用 long 替换后运行没有任何差别。
time_t timep;
1
2、利用函数time()获取从1970年至今的秒数
time(&timep);
1
函数原型 : time_t time(time_t *t);
time(&timep);
printf("%d",timep);
1
2
输出 : 1551193610
3、使用各种时间函数将time_t类型存储的秒数转换为常见的格式
我们可以用下面几种函数将秒数转化成我们常用的格式:
有点容易混淆,先把表格贴上来,方便对比异同。
函数名称 是否是准确时间(加地方时) 传入参数类型 返回值类型
localtime √ time_t类型的地址 const time_t * 结构体指针 stuct tm*
ctime √ time_t类型的地址 const time_t * 字符指针 char *
gmtime × time_t类型的地址 const time_t * 结构体指针 stuct tm*
asctime 加不加地方时取决于传入的结构体有没有加地方时(与上列函数不同类,在此仅作对比辨析) struct tm结构体类型的指针 const struct tm* 字符指针 char *
asctime()函数其作用是将结构中的信息转换字符串格式,加不加地方时取决于传入的结构体有没有加地方时,传入用 localtime生成的结构体加地方时,传入用gmtime生成的结构体不加地方时。asctime()与上列函数不同类,localtime、ctime、gmtime是将存在 time_t类型中的秒数转化为字符串或stuct tm结构体类型,而asctime则是将stuct tm结构体转化为字符串,因此在此仅作对比辨析,详细的我在第4点中细说。
【UTC就是0时区的时间,UTC加上地方时为本地时间】
这里出现了一个新名词:地方时,因为咱们存在time_t中的总秒数是以0时区为准的,要加上地方时才是当前所在地的真实时间。(至于时区的概念可以参考高中还是初中的地理书)
简单来说:想要获取当前电脑显示的时间,请选用localtime,ctime这两个加过地区时的函数。
【例如我所在区域(真正时间为Tue May 11 22:10:58 2021)
用加地方时的函数输出:Tue May 11 22:10:58 2021
不加地方时的函数输出:Tue May 11 14:10:58 2021
相差8个小时(北京为东八区)】
(1) localtime
【加地方时】将timep转换为真实世界的时间,传入一个time_t类型变量的地址,返回一个struct tm结构体类型指针,优点是可以自行控制输出格式,缺点是不能直接当作字符串输出,得用指针访问结构体内部输出。
函数原型 : stuct tm* localtime(const time_t *timep);
struct tm *p;
p = localtime(&timep);
printf("%d/%d/%d %02d:%02d:%02d\n", 1900 + p->tm_year, 1+ p->tm_mon,
p->tm_mday,p->tm_hour, p->tm_min, p->tm_sec);
```
输出 : 2021/25/11 14:25:38
如果要输出星期的话,还要加上
```cpp
char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
printf("%s", wday[p->tm_wday]);
1
2
3
4
5
6
7
8
9
10
11
输出 : Tue
(2)ctime
【加地方时】将timep转换为真实世界的时间,传入一个time_t类型变量的地址,返回一个字符数组指针,优点是可以直接按字符串输出,缺点是不能自行控制输出格式
函数原型 :char *ctime(const time_t *timep);
printf("%s", ctime(&timep));
1
输出 : Tue May 11 14:10:58 2021
--------------------------------
以上都是加地方时的:localtime,ctime
以下都是不加地方时(UTC)的:gmtime
--------------------------------
(3)gmtime
【不加地方时】传入一个time_t类型变量的地址,返回一个struct tm结构体类型指针,优点是可以自行控制输出格式,缺点是不能直接当作字符串输出,得用指针访问结构体内部输出。
和localtime类似,区别是gmtime不加地方时。
函数原型 : struct tm* gmtime(const time_t *timep);
struct tm *p;
p = gmtime(&timep);
printf("%d/%d/%d %02d:%02d:%02d\n", 1900 + p->tm_year, 1+ p->tm_mon,
p->tm_mday,p->tm_hour, p->tm_min, p->tm_sec);
1
2
3
4
输出 : 2021/5/11 14:31:07
【实际时间:2021/5/11 22:31:07】
如果要输出星期的话,还要加上
char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
printf("%s", wday[p->tm_wday]);
1
2
输出 : Thu
4、将struct tm结构体转化为字符串
asctime函数
传入一个struct tm结构体类型的指针,返回一个字符数组指针。
我们用localtime或者gmtime将秒数转化成struct tm结构体类型就是为了可以自己定义输出方式,这个函数的作用是将我们好不容易转化的struct tm结构体类型按照字符串的格式输出,嗯~ o( ̄▽ ̄)o有点迷……只能说函数给的很全面,作用就是这么个作用。
函数原型 : char * asctime(const struct tm* timeptr);
(1)用localtime转化成的结构体是加地方时的。
asctime(localtime(&timep))与ctime(&timep)效果完全相同。
前者先将秒数转化成结构体再转化成字符串,后者直接将秒数转化成字符串格式。
printf("%s", asctime(localtime(&timep))); //输出 : Thu Feb 28 13:38:41 2019
1
(2)用gmtime转化成的结构体是不加地方时的。
printf("%s", asctime(gmtime(&timep)));//输出 : Thu Feb 28 05:38:41 2019
1
再友情提醒一遍,当前真实时间是Thu Feb 28 13:38:41 2019哦~
5、一些不常用的其他函数
(1)difftime返回两个时间相差的秒数
double difftime(time_t time1, time_t time2);
1
(2)gettimeofday返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用
int gettimeofday(struct timeval *tv, struct timezone *tz);
1
(3)mktime将struct tm 结构的时间转换为从1970年至今的秒数
(果然函数给的很全,这种都有……)
time_t mktime(struct tm* timeptr);
1
四、回顾与梳理
在计算机中时间都是从(1970年01月01日 0:00:00)开始计算秒数的。
1、我们首先定义time_t 这种类型(本质上是长整型long)来存储从1970年到现在经过了多少秒。
2、再通过函数time()来获取从1970年到现在经过了多少秒
3、为了便于阅读,我们采用函数将“过了多少秒”进行转化
可以用以下函数,这里再次辨析一遍
函数名称 是否是准确时间(加地方时) 区别
localtime 准确时间 传入秒数,输出结构体,方便自定义格式输出
ctime 准确时间 传入秒数,输出字符指针,方便直接输出
gmtime 非本地时间,是0时区时间 传入秒数,输出结构体,方便自定义格式输出
4、一些其他函数
主要是asctime函数,它的作用是将struct tm结构体转化为字符串,加不加地方时完全取决于传入的结构体有没有加地方时。有的博文将他归类为生成不加地方时的函数,是不合理的,大家注意辨析。
【这块儿很简单,但是用的时候发现参考了一堆文章,发现网上有的思路不是很清晰,本来想写简明,结果啰啰嗦嗦一大堆……第一次写博文,写的不好的地方大家多担待,也欢迎大家提出建议意见】
【C/C++】获取当前系统时间(time_t和tm)清晰梳理_c++ time_t_YuXi_0520的博客-CSDN博客一、代码实现:获取系统时间,并将当前时间存到一个字符数组里面#include &amp;amp;amp;amp;amp;amp;amp;amp;lt;time.h&amp;amp;amp;amp;amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;amp;amp;amp;gt;https://blog.csdn.net/weixin_44032878/article/details/87939039