//viminfo文件中匹配 文件中的某行:* 1590632880 0
string temp = buf;//将上述举例行存入temp
std::smatch sma;
std::regex rex(".*?(\\d+).*?0");
bool ret = std::regex_search(temp,sma,rex);
tm *t_tm;
time_t timer;
//匹配到的1590632880
timer = std::stoi(string(sma[1]));
//将1900年到现在的秒数转换为本地时间
t_tm = localtime(&timer);
//等同于spritf如下
strftime(time, sizeof(time), "%Y-%m-%d %H:%M:%S",t_tm);
//sprintf(time,"%d-%02d-%02d %02d:%02d:%02d",t_tm->tm_year+1900,t_tm->tm_mon+1,t_tm->tm_mday,t_tm->tm_hour,t_tm->tm_min,t_tm->tm_sec);
输出:2020-05-28 10:28:00
从UTC的年月日时分秒格式转换为东八区北京的年月日时分秒格式,mktime好像对于时区没有区分,我测试了一下,获取的时间还是UTC时间
mktime(utc time)–>localtime()–>结果还是本地
所以自己写一个UTC的年月日时分秒格式转换为东八区北京的年月日时分秒格式
思路简单:闰年平年每个月多少天
void ToolFun::UtcToLocaltime(string &Localtime,const char* date)
{
char time[24] = "";
int year = 0,month = 0,day = 0,hour = 0,min = 0,sec = 0;
//每个月有多少天
int maxday = 0;
year = atoi(date);
month = atoi(date + 5);
day = atoi(date + 8);
//Beijing Time
hour = atoi(date + 11) + 8;
min = atoi(date + 14);
sec = atoi(date + 17);
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
maxday = 31;
}
else if(month == 4 || month == 6 || month == 9 || month == 11)
{
maxday = 30;
}
else
{
//闰年的2月为29天,平年为28天
if((year % 400 == 0)||(year % 4 == 0 && year % 100 != 0))
maxday = 29;
else
maxday = 28;
}
//+8超过24点
if(hour >= 24)
{
hour -= 24;
day += 1;
//超过24点加一天若超过这个月的最后一天
if(day > maxday)
{
day -= maxday;
month += 1;
//超过12个月加一年
if(month > 12)
{
month -= 12;
year += 1;
}
}
}
sprintf(time,"%d-%02d-%02d %02d:%02d:%02d",year,month1,day,hour,min,sec);
Localtime = time;
return;
}