web-dev-qa-db-fra.com

C++ 11 obtenir la date et l'heure actuelles sous forme de chaîne

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. 

6
kiigass

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
9
Howard Hinnant

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.

4
Yam Marcovic

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;
}
2
Abhishek Rathore

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.

2
Angus Comber

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.

0
Timmmm