98 votes

Date et heure actuelles sous forme de chaîne de caractères

J'ai écrit une fonction pour obtenir la date et l'heure actuelles en format : DD-MM-YYYY HH:MM:SS . Cela fonctionne mais, disons-le, c'est assez laid. Comment puis-je faire exactement la même chose mais plus simple ?

string currentDateToString()
{
    time_t now = time(0);
    tm *ltm = localtime(&now);

    string dateString = "", tmp = "";
    tmp = numToString(ltm->tm_mday);
    if (tmp.length() == 1)
        tmp.insert(0, "0");
    dateString += tmp;
    dateString += "-";
    tmp = numToString(1 + ltm->tm_mon);
    if (tmp.length() == 1)
        tmp.insert(0, "0");
    dateString += tmp;
    dateString += "-";
    tmp = numToString(1900 + ltm->tm_year);
    dateString += tmp;
    dateString += " ";
    tmp = numToString(ltm->tm_hour);
    if (tmp.length() == 1)
        tmp.insert(0, "0");
    dateString += tmp;
    dateString += ":";
    tmp = numToString(1 + ltm->tm_min);
    if (tmp.length() == 1)
        tmp.insert(0, "0");
    dateString += tmp;
    dateString += ":";
    tmp = numToString(1 + ltm->tm_sec);
    if (tmp.length() == 1)
        tmp.insert(0, "0");
    dateString += tmp;

    return dateString;
}

207voto

soon Points 12000

Depuis C++11, vous pouvez utiliser std::put_time de iomanip en-tête :

#include <iostream>
#include <iomanip>
#include <ctime>

int main()
{
    auto t = std::time(nullptr);
    auto tm = *std::localtime(&t);
    std::cout << std::put_time(&tm, "%d-%m-%Y %H-%M-%S") << std::endl;
}

std::put_time est un manipulateur de flux, il peut donc être utilisé conjointement avec std::ostringstream afin de convertir la date en une chaîne de caractères :

#include <iostream>
#include <iomanip>
#include <ctime>
#include <sstream>

int main()
{
    auto t = std::time(nullptr);
    auto tm = *std::localtime(&t);

    std::ostringstream oss;
    oss << std::put_time(&tm, "%d-%m-%Y %H-%M-%S");
    auto str = oss.str();

    std::cout << str << std::endl;
}

140voto

Max Points 1609

Solution non C++11 : Avec le <ctime> vous pouvez utiliser strftime . Assurez-vous que votre tampon est suffisamment grand, vous ne voudriez pas le dépasser et causer des dégâts plus tard.

#include <iostream>
#include <ctime>

int main ()
{
  time_t rawtime;
  struct tm * timeinfo;
  char buffer[80];

  time (&rawtime);
  timeinfo = localtime(&rawtime);

  strftime(buffer,sizeof(buffer),"%d-%m-%Y %H:%M:%S",timeinfo);
  std::string str(buffer);

  std::cout << str;

  return 0;
}

29voto

birubisht Points 342

Vous pouvez utiliser la fonction asctime() de time.h pour obtenir une chaîne simplement .

time_t _tm =time(NULL );

struct tm * curtime = localtime ( &_tm );
cout<<"The current date/time is:"<<asctime(curtime);

Exemple de sortie :

The current date/time is:Fri Oct 16 13:37:30 2015

17voto

Synck Points 334

Avec C++20, le formatage des points de temps (en chaîne) est disponible dans la bibliothèque standard (chrono). https://en.cppreference.com/w/cpp/chrono/system_clock/formatter

#include <chrono>
#include <format>
#include <iostream>

int main()
{
   const auto now = std::chrono::system_clock::now();
   std::cout << std::format("{:%d-%m-%Y %H:%M:%OS}", now) << '\n';
}

Sortie

13-12-2021 09:24:44

Il fonctionne dans Visual Studio 2019 (v16.11.5) avec la dernière version du langage C++ (/std:c++latest).

7voto

Francis Points 686

En utilisant C++ dans MS Visual Studio 2015 (14), j'utilise :

#include <chrono>

string NowToString()
{
  chrono::system_clock::time_point p = chrono::system_clock::now();
  time_t t = chrono::system_clock::to_time_t(p);
  char str[26];
  ctime_s(str, sizeof str, &t);
  return str;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X