2009-06-15 9 views

Répondre

33

Essayez std::stringstream.

#include <string> 
#include <sstream> 

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

Une enveloppe agréable autour de la technique ci-dessus est de lexical_cast Boost:

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

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

Et pour des questions comme cela, je suis friand de lier The String Formatters of Manor Farm par Herb Sutter.

MISE À JOUR:

Avec 11 C++, utilisez to_string().

1

La norme C++ ne possède aucune fonction d'heure et de date: vous devez utiliser la fonction C localtime et les fonctions associées.

+6

Votre question initiale a demandé comment pour obtenir une date, mais il s'avère que ce que vous vouliez vraiment était le nombre de secondes comme une chaîne. Cela aide à être précis. –

20

Essayez ceci si vous voulez avoir le temps 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 référence strftime() consultez cppreference.com

+0

nulldevice, je n'étais pas clair ci-dessus, mais je voulais une représentation sous forme de chaîne de la date de l'époque (timestamp). – g33kz0r

1

la fonction « ctime() » convertit un temps à une chaîne. Si vous souhaitez contrôler la façon dont il est imprimé, utilisez "strftime". Cependant, strftime() prend un argument de "struct tm". Utilisez "localtime()" pour convertir l'entier time_t 32 bits en un struct tm.

0

Il existe une myriade de façons de formater l'heure (en fonction du fuseau horaire, comment vous voulez l'afficher, etc.), donc vous ne pouvez pas simplement convertir implicitement un time_t en une chaîne.

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

Si vous souhaitez effectuer une conversion de type C++, vous pouvez rechercher la bibliothèque Boost.DateTime.

+0

Mis à jour. Merci. –

2

La méthode C++ consiste à utiliser un flux strings.

Le C est d'utiliser snprintf() pour formater le nombre:

char buf[16]; 
snprintf(buf, 16, "%lu", time(NULL)); 
+1

time_t n'est pas nécessairement non signé ou de la même taille qu'un long. En fait, il est généralement signé: http://stackoverflow.com/questions/471248/what-is-ulantly-a-time-t-typedef-to – nitzanms

3

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

Voir les exemples suivants démontrent à la fois la stringstream et des réponses 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é here


#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; 
} 

Sortie: 1485498912/1485498912 Trouvé : here


La 2ème solution fonctionne mieux notés 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; 
} 

Sortie: 1485498912/27/01/2017 06:35:12 Fonder: here


Questions connexes