Ive a écrit la fonction suivante qui reçoit un point de temps et retourner une chaîne ISO avec millisecondes:localtime_s et la construction d'utilisation strftime chaîne de temps 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();
}
Ive utilisé pour exécuter que sur Linux avec le localtime()
fonctionne sans problèmes du tout. Maintenant, je migre vers Windows/VS2012 et le compilateur suggère de changer localtime()
pour un localtime_s()
plus sûr, fait immédiatement.
Après la conversion de l'appel strftime
ne se bloque lors de l'exécution avec l'erreur suivante:
Expression: ("Invalid format directive", 0)
compilation fonctionne très bien. Aide appréciée pour savoir ce qui se passe ici. Je devine quelque chose de simple que je ne peux pas remarquer ...
Jerry, essayé 'ss Ive << std :: put_time (& timeinfo, "% FT% TZ") ; 'sans succès aussi ... Même erreur ... Seens que'% FT' et '% TZ' ne sont pas supportés du tout dans VS2012.Donc j'ai changé pour '"% Y-% m-% dT% H:% M:% SZ "et travaille avec' strftime' ET std :: put_time. Merci pour ton aide. – Mendes
@Mendes: Oui, je suppose que 'put_time' est un peu plus qu'un wrapper autour de' strftime' (ou les deux utilisent le même moteur), donc pour un compilateur donné, les deux sont susceptibles de supporter les mêmes conversions-- La commutation entre eux est purement une question de commodité, pas susceptible d'affecter votre question initiale. –