【发布时间】:2016-07-11 11:55:20
【问题描述】:
我编写了以下函数,它接收一个时间点并返回一个以毫秒为单位的 ISO 字符串:
std::string TimePointToISOString(const std::chrono::time_point<std::chrono::system_clock>& time)
{
std::time_t rawTime = std::chrono::system_clock::to_time_t(time);
struct tm timeinfo;
localtime_s(&timeinfo, &rawTime);
std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(time.time_since_epoch());
std::size_t frac_seconds = ms.count() % 1000;
char buffer[32];
std::strftime(buffer, 32, "%FT%TZ", &timeinfo);
std::string bufferStr(buffer);
std::stringstream ss;
ss << bufferStr.substr(0, 19) << "." << std::setw(3) << std::setfill ('0') << frac_seconds << bufferStr.substr(20);
return ss.str();
}
我曾经在 Linux 上使用 localtime() 函数运行它,完全没有问题。现在我正在迁移到 Windows/VS2012,编译器建议将localtime() 更改为更安全的localtime_s(),立即完成。
转换后,strftime 调用确实在运行时崩溃并出现以下错误:
Expression: ("Invalid format directive", 0)
编译运行良好。感谢您帮助了解这里发生了什么。我猜是一些我无法注意到的简单事情......
【问题讨论】:
标签: c++ c++11 strftime chrono localtime