C++11 pour obtenir la date et l'heure actuelle comme une chaîne de caractères
Quel est l'état de l'art afin d'obtenir la date et l'heure comme une chaîne de caractères en c++11?
Je sais à propos de std::put_time
, mais la référence dit que je ne l'utiliser que dans les cours d'eau.
Il est std::chrono::system_clock
qui fournit to_time_t
de retourner le temps que time_t
et sans date, n'est-ce pas?
Je pourrais utiliser un stringstream comme bames53: La sortie de la Date et de l'Heure en C++ en utilisant std::chrono mais cela semble être une solution de contournement.
- Voir en.cppreference.com/w/cpp/chrono/c/strftime.
- Personnellement, je resterais loin de std::chrono, mais c'est votre appel. abhishek ratore la réponse est très bon dans ce domaine.
Vous devez vous connecter pour publier un commentaire.
À l'aide de Howard Hinnant est gratuit, open-source d'en-tête uniquement datetime bibliothèque, vous pouvez obtenir de l'heure UTC actuelle comme un
std::string
en une seule ligne de code:J'ai juste couru à ce, et la chaîne contient:
C'est le droit, il vous donne même la totalité de précision. Si vous n'aimez pas ce format, tous les
strftime
mise en forme des drapeaux sont disponibles. Si vous voulez que votre heure locale, il y a un le fuseau horaire de la bibliothèque également disponible, si ce n'est pas d'en-tête uniquement.De sortie:
Tout d'abord,
std::time_t
en effet reflète à la fois la date et l'heure, puisqu'il représente généralement secondes depuis le 1er janvier 1970.Il n'y a pas de grande de soutien pour la gestion des dates en C++11. Vous avez encore à dépendre sur un coup de pouce si vous ne souhaitez pas le faire, pour la plupart, manuellement. Voici comment le faire manuellement.
Vous pouvez l'utiliser dans un thread-safe façon—avec tout
std::chrono::*clock
, commestd::system_clock
, comme ceci:Quelque part d'autre, vous pouvez question:
La relativement bonne chose à propos de cette solution est que, au niveau de l'API, vous êtes toujours à l'aide de moderne, portable C++ concepts tels que
std::chrono::time_point
, et bien sûr,std::string
.std::chrono::system_clock::time_point
pour l'argument de la fonction. Le tamponsome_buffer
est char array (par exemplechar some_buffer[64];
) qui doivent être déclarées à l'intérieur de la fonction et ne doit pas être statique (sinon, tout le fil de sécurité est perdu). Il est possible de réutiliser lestd::string
tampon interne pour que (redimensionner, puis contrat) et d'éviter la copie.timestamp comme cela;
Date d'une manière similaire.
Vous pouvez utiliser l'extrait de code donné ci-dessous car il permettra de servir vos fins. Ici, l'utilisation temps.h fichier d'en-tête requis localtime() la fonction, puis à l'aide de la strftime() fonction avec les paramètres requis donnera le résultat et il la retourne comme une chaîne de caractères.
std::string
est retourné, temporellestd::string buf
est une meilleure option. Qui permettrait d'éliminer une surcharge pour la construction de chaîne à partir d'un char tampon. Dans l'exemple fourni parreturn buf
==std::string(buf)
, qui invoquentmemcpy
pour copier 'buf' nouvellement créé de retour de sting. Après tout:std::string buf; buf.resize(40); ... strftime((char*)buf.data(), 40, "%A %d/%m/%Y", &tstruct);
De plus simple:
Régler le format approprié pour le temps aussi.
Remarque que je crois que cela ne fonctionne pas bien pour code multithread depuis
std::localtime()
retourne un pointeur interne d'struct.