时间戳转化
在使用年月日时分秒转成timestamp的时候,会用到mktime
在win上我们mktime(UTC)输出的时间比中国时间小8小时
在Linux上mktime(UTC),本地Linux中国时间;输出的时间戳比实际的小2*8小时
总会有些问题;下边是参考简书的一个自己写的时间转时间戳的东西
:parse(string& str) {//is utc T,Z std::tm tm = {}; //%4d-%2d-%2dT%2d:%2d:%2dZ int ano = stoi(str.substr(0, 4)); int mes = stoi(str.substr(5, 2)); int dia = stoi(str.substr(8, 2)); int hora = stoi(str.substr(11, 2)); int minuto = stoi(str.substr(14, 2)); int segundo = stoi(str.substr(17, 2)); // Passo 1. long anosDesde1970 = ano - 1970; // Passo 2. long periodosDe400Anos = anosDesde1970 / 400; int anoNoPeriodoDe400Anos = anosDesde1970 % 400; // Passo 3. int periodosDe4AnosNos400 = anoNoPeriodoDe400Anos / 4; int anoNoPeriodoDe4Anos = anoNoPeriodoDe400Anos % 4; // Passo 4. int diasNosAnosAnterioresDoPeriodoDe4Anos = 365 * anoNoPeriodoDe4Anos + (anoNoPeriodoDe4Anos == 3 ? 1 : 0); // long segundosPorAno = segundosPorDia * diasNosAnosAnterioresDoPeriodoDe4Anos; // Passo 5. long diasNoAno = dia - 1; int tabelaDeMeses[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; for (int i = 0; i < mes - 1; i++) { diasNoAno += tabelaDeMeses[i]; } // Passo 6. long dias = diasNoAno + diasNosAnosAnterioresDoPeriodoDe4Anos + periodosDe4AnosNos400 * 1461 + periodosDe400Anos * 146097; // Passo 7. if (anoNoPeriodoDe4Anos == 2 && mes > 2) dias++; if (anoNoPeriodoDe400Anos > 130 || (anoNoPeriodoDe400Anos == 130 && mes > 2)) dias--; if (anoNoPeriodoDe400Anos > 230 || (anoNoPeriodoDe400Anos == 230 && mes > 2)) dias--; if (anoNoPeriodoDe400Anos > 330 || (anoNoPeriodoDe400Anos == 330 && mes > 2)) dias--; // Passo 8. //return segundo + 60 * minuto + 60 * 60 * hora + 60 * 60 * 24 * dias; long timeStamp = segundo + 60 * minuto + 60 * 60 * hora + 60 * 60 * 24 * dias; //if (m_time_houe_off > 0) // { // timeStamp += 3600 * m_time_houe_off; // } //return 60; return timeStamp; }