I've написал следующую функцию, которая принимает момент времени и возвращает строку ISO с миллисекундах:localtime_s и строительство использования STRFTIME времени строка 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();
}
I've используется для запуска, что на Linux с localtime()
функция без проблем. Теперь я перехожу к Windows/VS2012, и компилятор предлагает изменить localtime()
для более безопасного localtime_s()
, сделанного немедленно.
После конверсии strftime
вызова делает врезаться во время выполнения со следующей ошибкой:
Expression: ("Invalid format directive", 0)
Компиляция работает нормально. Помогите оценить, что здесь происходит. Я думаю, что-то простое, что я не могу заметить ...
Джерри, I've пытался 'сс << станд :: put_time (& timeinfo, "% FT% TZ") ; 'без успеха также ... Такая же ошибка ... Seens, что'% FT' и '% TZ' вообще не поддерживаются в VS2012.Поэтому я изменился на «% Y-% m-% dT% H:% M:% SZ» и работает с 'strftime' AND std :: put_time. Спасибо за помощь. – Mendes
@Mendes: Да, я бы предположил, что 'put_time' - это нечто большее, чем обертка вокруг' strftime' (или оба используют один и тот же движок), поэтому для любого заданного компилятора они, вероятно, будут поддерживать одни и те же преобразования - переключение между ними является исключительно вопросом удобства, вряд ли повлияет на ваш первоначальный вопрос. –