从epoch到dateformat C ++的毫秒数

时间:2014-03-17 13:17:42

标签: c++ datetime milliseconds gregorian-calendar valueconverter

我在long long int中的特定时间内有epoch(windows / gregorian)后的毫秒数,并希望将其转换为人类时间,例如yy-mm-dd-hh-mm-ss-milli。 (我的平台:Windows 7,64位)

不幸的是,到目前为止我找到的所有解决方案都无法处理毫秒(long long int)部分。

2 个答案:

答案 0 :(得分:0)

基本上,你应该能够把你所拥有的任何东西写成没有毫秒的格式化时间,并将剩余的分数除以毫秒数。这应该可行,因为跳跃时间总是一个整数秒数。

假设C ++ 11,你可以试试这个:

#include <chrono>
#include <iomanip>

using namespace std;
using namespace chrono;

long long int milliSecondsSinceEpoch = ... // this is your starting point
const auto durationSinceEpoch = std::chrono::milliseconds(milliSecondsSinceEpoch);
const time_point<system_clock> tp_after_duration(durationSinceEpoch);
time_t time_after_duration = system_clock::to_time_t(tp_after_duration);

std::tm* formattedTime = std::localtime(&time_after_duration);

long long int milliseconds_remainder = milliSecondsSinceEpoch % 1000;
cout <<put_time(std::localtime(&time_after_duration), "%y-%m-%d-%H-%M-%S-") << milliseconds_remainder << endl;

答案 1 :(得分:0)

C ++ 11 API不完整,所以我不得不发明一辆自行车:

    static long getTs() {
        struct timeval tp;
        gettimeofday(&tp, NULL);
        long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
        return ms;
    }

    static string format(long ts,string fmt,int cutBack=0){
        time_t tt = ts/1000;
        int microsec = ts%1000;
        struct std::tm * ptm = std::localtime(&tt);
        string fmtms=std::regex_replace(fmt, std::regex("%ms"), to_string(microsec));
        std::stringstream ss;
        ss << std::put_time(ptm, fmtms.c_str());
        string ret = ss.str();
        return ret.substr(0,ret.size()-cutBack);
    }

    std::cout << CommonUtils::format(CommonUtils::getTs(), "%Y-%m-%dT%H:%M:%S.%ms%Z")<<endl;

给我:2020-01-24T11:55:14.375 + 07,cutBack参数是可选的,它指定要从输出字符串中删除多少个字符。当像+0700这样的时区格式太长,而您只需要+07时,这很有用。