我在long long int中的特定时间内有epoch(windows / gregorian)后的毫秒数,并希望将其转换为人类时间,例如yy-mm-dd-hh-mm-ss-milli。 (我的平台:Windows 7,64位)
不幸的是,到目前为止我找到的所有解决方案都无法处理毫秒(long long int)部分。
答案 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时,这很有用。