C++时间戳和时间格式互转学习
时间戳转特定的时间格式
在<time.h>库函数中,定义了时间相关数据结构,⼀般使⽤time_t来表⽰时间戳,可以⽤int,long来表⽰,tm表⽰时间相关数据结构
#include<iostream>
#include<time.h>
int main() {
time_t timeStamp1 = (time_t)0;
time_t timeStamp2 = (time_t)3600;
struct tm time1;
struct tm time2;
localtime_s(&time1, &timeStamp1);
localtime_s(&time2, &timeStamp2);
printf("%d-%d-%d %d:%d:%d\n", _year + 1900, _mon + _mday, _hour, _min, _sec);
printf("%d-%d-%d %d:%d:%d\n", _year + 1900, _mon + _mday, _hour, _min, _sec);
return 0;
}
1970-1-1 8:0:0
1970-1-1 9:0:0
之前很多博⽂转换应该使⽤localtime()⽅法,但是新版的VS并不能使⽤
1>C:\Users\Administrator.DESKTOP-2EJND90\Desktop\temp\test\test.cpp(68): 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.
查阅发现,localtime并不是线程安全的,观察localtime和localtime_s的调⽤发现,localtime在使⽤时,我们只需定义⼀个时间戳指针,并不需要为时间相关的那个数据结构指针申请空间,⽽指针必须要指向内存空间才可以使⽤,其实申请空间的动作由函数⾃⼰完成,这样在多线程的情况下,如果有另⼀个线程调⽤了这个函数,那么指针指向的struct tm结构体的数据就会改变。在localtime_s与localtime_r调⽤时,定义的是struct tm的结构体,获取到的时间已经保存在struct tm中,并不会受其他线程的影响。
⾃定义时间格式字符串转成时间戳
⼀开始设定好传⼊字符串格式,截取不同地⽅的字符串,赋值给时间戳数据结构struct tm,我这⾥⽤正则截取了需要的时间信息
#include <iostream>
#include <time.h>
#include<regex>
using namespace std;
int standard_to_stamp(std::string str_time){
struct tm stm;
int iY, iM, iD, iH, iMin, iS;
memset(&stm, 0, sizeof(stm));
//正则提取⽇期信息
std::regex re("(\\d+)/(\\d+)/(\\d+)(\\s)(\\d+):(\\d+):(\\d+)");
std::smatch sm;
unix时间戳转换日期格式std::regex_search(str_time, sm, re);
std::string yearString = sm[1];
std::string monthString = sm[2];
std::string dayString = sm[3];
std::string hourString = sm[5];
std::string minuteString = sm[6];
std::string secondString = sm[7];
//数据结构赋值
iY = atoi(yearString.c_str());
iM = atoi(monthString.c_str());
iD = atoi(dayString.c_str());
iH = atoi(hourString.c_str());
iMin = atoi(minuteString.c_str());
iS = atoi(secondString.c_str());
<_year = iY - 1900;
<_mon = iM - 1;
<_mday = iD;
<_hour = iH;
<_min = iMin;
<_sec = iS;
printf("%d-%0d-%0d %0d:%0d:%0d\n", iY, iM, iD, iH, iMin, iS);
return (int)mktime(&stm);
}
int main(){
int stampTime1 = standard_to_stamp("1970/1/1 10:00:00");
cout << stampTime1 << endl;
return 0;
}
1970-1-1 10:0:0
7200
快速获取当前时间的⽅法(CTime)以及坑简单例⼦
#include <iostream>
#include "atltime.h"
using namespace std;
int main() {
CTime timeNow = CTime::GetCurrentTime();
int year = timeNow.GetYear();
std::cout << year;
return 0;
}
2019
存在问题
会和std::max,std::min两个⽅法不兼容
报⼀个⾮常奇怪的错误
解决⽅法是把(std::min)括号括起来就好
参考
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论