web-dev-qa-db-fra.com

Représentation sous forme de chaîne de time_t?

time_t seconds;
time(&seconds);

cout << seconds << endl;

Cela me donne un horodatage. Comment puis-je obtenir cette date Epoch dans une chaîne?

std::string s = seconds;

ne marche pas

27
g33kz0r

Essayez std::stringstream .

#include <string>
#include <sstream>

std::stringstream ss;
ss << seconds;
std::string ts = ss.str();

Un bon encapsuleur autour de la technique ci-dessus est Boost's lexical_cast :

#include <boost/lexical_cast.hpp>
#include <string>

std::string ts = boost::lexical_cast<std::string>(seconds);

Et pour des questions comme celle-ci, j'aime bien relier Les formateurs de chaînes de Manor Farm de Herb Sutter.

METTRE À JOUR:

Avec C++ 11, utilisez to_string() .

36
Fred Larson

Essayez ceci si vous voulez avoir l'heure dans une chaîne lisible:

#include <ctime>

std::time_t now = std::time(NULL);
std::tm * ptm = std::localtime(&now);
char buffer[32];
// Format: Mo, 15.06.2009 20:20:00
std::strftime(buffer, 32, "%a, %d.%m.%Y %H:%M:%S", ptm);  

Pour plus de références sur strftime (), consultez cppreference.com

24
nulldevice

La meilleure réponse ici ne fonctionne pas pour moi.

Voir les exemples suivants montrant les réponses stringstream et lexical_cast comme suggéré:

#include <iostream>
#include <sstream>

int main(int argc, char** argv){
 const char *time_details = "2017-01-27 06:35:12";
  struct tm tm;
  strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm);
  time_t t = mktime(&tm); 
  std::stringstream stream;
  stream << t;
  std::cout << t << "/" << stream.str() << std::endl;
}

Sortie: 1485498912/1485498912 Trouvé ici


#include <boost/lexical_cast.hpp>
#include <string>

int main(){
    const char *time_details = "2017-01-27 06:35:12";
    struct tm tm;
    strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm);
    time_t t = mktime(&tm); 
    std::string ts = boost::lexical_cast<std::string>(t);
    std::cout << t << "/" << ts << std::endl;
    return 0;
}

Résultat: 1485498912/1485498912 Trouvé: ici


La deuxième solution la mieux cotée fonctionne localement:

#include <iostream>
#include <string>
#include <ctime>

int main(){
  const char *time_details = "2017-01-27 06:35:12";
  struct tm tm;
  strptime(time_details, "%Y-%m-%d %H:%M:%S", &tm);
  time_t t = mktime(&tm); 

  std::tm * ptm = std::localtime(&t);
  char buffer[32];
  std::strftime(buffer, 32, "%Y-%m-%d %H:%M:%S", ptm);
  std::cout << t << "/" << buffer;
}

Output: 1485498912/2017-01-27 06:35:12 Trouvé: ici


3
Mo Morsi

La méthode C++ consiste à utiliser stringstream. 

La méthode C consiste à utiliser snprintf () pour formater le nombre:

 char buf[16];
 snprintf(buf, 16, "%lu", time(NULL));
2
Reed Hedges

Standard C++ ne possède pas de fonction heure/date - vous devez utiliser C localtime et les fonctions associées.

1
anon

la fonction "ctime ()" convertira une heure en chaîne . Si vous souhaitez contrôler le mode d'impression, utilisez "strftime". Cependant, strftime () prend un argument de "struct tm". Utilisez "localtime ()" pour convertir le nombre entier time_t 32 bits en une struct tm.

1
Matthias Wandel

Voici mon formateur - commentaires bienvenus. Cela semblait être le meilleur moyen de m'aider à poster des messages pour tous ceux qui recherchent la même chose.

#include <iostream>
#include "Parser.h"
#include <string>
#include <memory>
#include <ctime>
#include <chrono>
#include <iomanip>
#include <thread>

using namespace std;
string to_yyyyMMddHHmmssffffff();

string to_yyyyMMddHHmmssffffff() {
    using namespace std::chrono;
    high_resolution_clock::time_point pointInTime = high_resolution_clock::now();
    std::time_t now_c = std::chrono::system_clock::to_time_t(pointInTime);
    microseconds micros = duration_cast<microseconds>(pointInTime.time_since_Epoch());
    std::size_t fractional_microseconds = micros.count() % 1'000'000;

    std:stringstream microstream;
    microstream << "00000" << fractional_microseconds;
    string formatted = microstream.str();
    int index = formatted.length() - 6;
    formatted = formatted.substr(index);
    std::stringstream dateStream;
    dateStream << std::put_time(std::localtime(&now_c), "%F %T") << "." << formatted;
    formatted = dateStream.str();

    return formatted;
}
0
No Refunds No Returns

Il existe une multitude de façons de formater l'heure (en fonction du fuseau horaire, de la manière dont vous voulez l'afficher, etc.), de sorte que vous ne pouvez pas convertir implicitement simplement time_t en chaîne.

La méthode C consiste à utiliser ctime ou à utiliser strftime plus/ localtime ou gmtime .

Si vous souhaitez utiliser une méthode plus semblable à C++, vous pouvez explorer la bibliothèque Boost.DateTime .

0
Josh Kelley

heure locale n'a pas fonctionné pour moi. J'ai utilisé localtime_s:

struct tm buf;
char dateString[26];
time_t time = time(nullptr);
localtime_s(&buf, &time);
asctime_s(dateString, 26, &buf);
0