Quel est le moyen le plus moderne d’obtenir la date et l’heure sous forme de chaîne dans c ++ 11?
Je connais std::put_time
, mais la référence indique que je ne l'utiliserai que dans les flux.
Il y a std::chrono::system_clock
qui fournit to_time_t
renvoyant l'heure en tant que time_t
et sans date, n'est-ce pas?
Je pourrais utiliser un stringstream comme bames53: Sortie Date et heure en C++ en utilisant std :: chrono mais cela semble être une solution de contournement.
En utilisant la bibliothèque datetime gratuite en-tête open-source gratuite de Howard Hinnant , vous pouvez obtenir l'heure UTC actuelle sous la forme d'un std::string
sur une seule ligne de code:
std::string s = date::format("%F %T", std::chrono::system_clock::now());
Je viens d'exécuter ceci, et la chaîne contient:
2017-03-30 17:05:13.400455
C'est vrai, cela vous donne même toute la précision. Si vous n'aimez pas ce format, tous les indicateurs de formatage strftime
sont disponibles. Si vous voulez votre heure locale, il existe une bibliothèque timezone également disponible, bien que ce ne soit pas un en-tête seulement.
std::string s = date::format("%F %T %Z", date::make_zoned(date::current_zone(),
std::chrono::system_clock::now()));
Sortie:
2017-03-30 13:05:13.400455 EDT
Tout d’abord, std::time_t
enregistre en effet la date et l’heure, car il représente généralement les secondes à partir du 1er janvier 1970.
Il n'y a pas de support great pour la gestion des dates en C++ 11. Vous devez toujours compter sur boost si vous ne souhaitez pas le faire, principalement manuellement. Voici comment le faire manuellement.
Vous pouvez l'utiliser, de manière sécurisée pour les threads, avec n'importe quel std::chrono::*clock
, tel que std::system_clock
, comme ceci:
std::string get_date_string(std::chrono::time_point t) {
auto as_time_t = std::chrono::system_clock::to_time_t(t);
struct tm tm;
if (::gmtime_r(&as_time_t, &tm))
if (std::strftime(some_buffer, sizeof(some_buffer), "%F", &tm))
return std::string{some_buffer};
throw std::runtime_error("Failed to get current date as string");
}
Ailleurs, vous pouvez émettre:
get_date_string(std::system_clock::now());
Le relativement bon Le problème de cette solution est qu’au niveau de l’API, vous utilisez toujours des concepts C++ portables modernes, tels que std::chrono::time_point
et bien sûr, std::string
.
Vous pouvez utiliser l'extrait de code donné ci-dessous, car il servira à vos fins. Ici, utilisez time.h fichier en-tête pour la fonction requise localtime () puis utilisez la fonction strftime () avec les paramètres requis pour obtenir le résultat et le renvoie sous forme de chaîne.
#include <iostream>
#include <string>
#include <time.h>
std::string current_date();
std::string current_time();
int main(){
std::cout<<"Current date => "<<current_date()<<"\n";
std::cout<<"Current time => "<<current_time()<<"\n";
}
std::string current_date(){
time_t now = time(NULL);
struct tm tstruct;
char buf[40];
tstruct = *localtime(&now);
//format: day DD-MM-YYYY
strftime(buf, sizeof(buf), "%A %d/%m/%Y", &tstruct);
return buf;
}
std::string current_time(){
time_t now = time(NULL);
struct tm tstruct;
char buf[40];
tstruct = *localtime(&now);
//format: HH:mm:ss
strftime(buf, sizeof(buf), "%X", &tstruct);
return buf;
}
horodatage comme ça;
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
std::time_t start_time = std::chrono::system_clock::to_time_t(now);
char timedisplay[100];
struct tm buf;
errno_t err = localtime_s(&buf, &start_time);
if (std::strftime(timedisplay, sizeof(timedisplay), "%H:%M:%S", &buf)) {
std::cout << timedisplay << '\n';
}
}
Date de manière similaire.
Plus simple:
string CurrentDate()
{
std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
char buf[100] = {0};
std::strftime(buf, sizeof(buf), "%Y-%m-%d", std::localtime(&now));
return buf;
}
Ajustez le format en fonction de l'heure aussi.
Notez que je suspecte que cela ne fonctionnera pas bien pour le code multithread puisque std::localtime()
renvoie un pointeur sur une structure interne.