(C++)如何将指定时间日期转换成UNIX时间&如何将UNIX时间转换成日期

虽然称不上多难,但是找可用的方法东拼西凑还是要花点时间,纪录一下帮看到这篇的人省点时间
需求: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();}

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章