虽然称不上多难,但是找可用的方法东拼西凑还是要花点时间,纪录一下帮看到这篇的人省点时间
需求:C++语言标準ISO C++20
只使用STL库,不需额外Library
#include <chrono>#include <sstream>#include <iostream>string date2EpochTime(){ const int sec = 30; //秒数,两位数 const int minute = 30; //分钟,两位数 const int hour = 6; //小时,24小时制 const int mday = 15; //日期 const int mon = 5; //月份,实际还要再+1,所以这代表6月 const int year = 120; //年份差,与1900年的差距,所以这是2020年 struct tm tm_tm = {sec, minute, hour, mday, mon, year}; const time_t time_t_tm = mktime(&tm_tm);//注意,在转成epoch time时API会自动扣掉当前时区的小时差,所以在某些情况下, //可能会发生时区转换导致的错误。比如说凭证中的到期日使用的是UTC,但是转换时会视为GMT+8, //所以转换出来的epoch time会比实际上慢了8小时,解决办法是取时区时间差在帮他补回去,如下://取时区时间差 const auto chrono_now = std::chrono::system_clock::now(); const auto offset_seconds = std::chrono::current_zone()->get_info(chrono_now).offset;//将时间转成epoch time const auto time_point = std::chrono::system_clock::from_time_t(time_t_tm); //把时区时间差补回去 const auto timeSinceEpoch = (time_point + offset_seconds).time_since_epoch().count(); std::stringstream stream; stream << timeSinceEpoch; //转出来的epoch time取前10位,单位到秒 return stream.str().substr(0, 10);}std::string epochTime2Date(const std::string& epochTime) { long lEpochTime = std::stol(epochTime); auto date = std::chrono::sys_time<std::chrono::seconds>{std::chrono::seconds{lEpochTime}}; std::string timezone = std::chrono::get_tzdb().current_zone()->name().data(); //print std::cout << "Current timezone:" << timezone << std::endl; std::chrono::zoned_seconds zt{timezone.c_str(), date}; std::ostringstream oss; //oss << std::format("{:%F %T %Z}", zt); //2020-06-15 06:30:30 GMT+8 oss << std::format("{:%F}", zt); //2020-06-15 return oss.str();}