c++ 获取当前时间
1、基础概念
时间戳,是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
typedef __int64 __time64_t;
typedef __time64_t time_t;
在c++中我们定义的数据类型time_t 就是时间戳。目前相当一部分操作系统使用32位二进制数字表示时间。此类系统的时间戳最多可以使用到格林威治时间2038年01月19日03时14分07秒(二进制:01111111 11111111 11111111 11111111)。其后一秒,二进制数字会变为10000000 00000000 00000000 00000000,发生溢出错误,造成系统将时间误解为1901年12月13日20时45分52秒。这很可能会引起软件故障,甚至是系统瘫痪。使用64位二进制数字表示时间的系统(最多可以使用到格林威治时间292,277,026,596年12月04日15时30分08秒)则基本不会遇到这类溢出问题。
所以c++的源码中time_t 定义为了64位的int,有意思的知识又增加了!这波是真的细!
c++使用一个名为tm 的结构体存储时间,其中年份是从1900年起至今多少年,而不是直接存储如2011年,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon; 1+p->tm_mon;
int tm_year; 1900+ p->tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
2、应用举例
#include <time.h>
输出一个yy/mm/dd hh:mm:ss格式的当前时间
#include <iostream>
#include <string>
#include <time.h>
std::string GetNowTime() {
time_t setTime;
time(&setTime);
tm ptm;
localtime_s(&ptm, &setTime);
std::string time = std::to_string(ptm.tm_year + 1900)
+ "/"
+ std::to_string(ptm.tm_mon + 1)
+ "/"
+ std::to_string(ptm.tm_mday)
+ " "
+ std::to_string(ptm.tm_hour) + ":"
+ std::to_string(ptm.tm_min) + ":"
+ std::to_string(ptm.tm_sec);
return time;
}
int main(int argc, char *argv[]) {
std::string strTime = GetNowTime();
std::cout << "now time: " << strTime << std::endl;
system("pause");
return 0;
}
- localtime、localtime_s和localtime_r的区别和使用
localtime、localtime_s、localtime_r都是用于获取系统时间,其中localtime_r用于Linux平台下获取系统时间,localtime_s用于Windows平台获取系统时间,而localtime获取系统时间不区分系统。
在不涉及多线程,且只有一个系统时间的情况下,比如获取系统当前时间,使用localtime即可;但是在需要将多个时间转化为系统时间的格式,或者是多线程中使用时,应该根据系统类型选择使用localtime_s或localtime_r。
注:至于为什么会特意提到这三长得几乎一样的函数这件事,其实是localtime编译直接告诉我不安全,那我想不安全换一个呗,需求还能不写了不成?度娘告诉我localtime_s能行,于是windows写代码的时候它是真的行,但是换linux部署的时候就凉凉咯,又换成了localtime_r。所以我决定给它三直接挂网上网b一波,兄弟们我做的对吗?
?? 来都来了,不点个赞吗,不点点关注吗,不唠两句嗑吗?灰常感谢!!! ??
|