2013-06-20 18 views
39

Ho aggiornato alcuni vecchi codici e ho cercato di aggiornare il C++ 11 ove possibile. Il seguente codice è come ho usato per visualizzare l'ora e la data nel mio programmaEmissione di data e ora in C++ utilizzando std :: chrono

#include <iostream> 
#include <string> 
#include <stdio.h> 
#include <time.h> 

const std::string return_current_time_and_date() const 
{ 
    time_t now = time(0); 
    struct tm tstruct; 
    char buf[80]; 
    tstruct = *localtime(&now); 
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct); 
    return buf; 
} 

Vorrei uscita l'ora e la data in un formato simile utilizzando std :: crono (o simile), ma sono sicuro di come per fare così. Qualsiasi aiuto sarebbe molto apprezzato. Grazie

+0

Si prega di cercare se c'è già una domanda del genere e se non poi chiedere. – legends2k

+0

* Possibile duplicato: * http://stackoverflow.com/questions/12346260/c-date-and-time – legends2k

+3

Non riuscirai a migliorare molto con C++ 11. chrono ha più a che fare con il tempismo (da quanto tempo ha bisogno di qualcosa) rispetto alle cose tipo giorno-di-giorno. Potresti controllare Boost Date Time, però. Ha una funzionalità data e ora più robusta. –

risposta

63

La libreria <chrono> si occupa solo di ora e non di date, ad eccezione dello system_clock che ha la capacità di convertire i suoi punti di tempo in time_t. Quindi usare <chrono> per le date non migliorerà molto le cose. Speriamo di ottenere qualcosa come chrono::date in un futuro non troppo lontano.

Detto questo, è possibile utilizzare <chrono> nel seguente modo:

#include <chrono> // chrono::system_clock 
#include <ctime> // localtime 
#include <sstream> // stringstream 
#include <iomanip> // put_time 
#include <string> // string 

std::string return_current_time_and_date() 
{ 
    auto now = std::chrono::system_clock::now(); 
    auto in_time_t = std::chrono::system_clock::to_time_t(now); 

    std::stringstream ss; 
    ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); 
    return ss.str(); 
} 

noti che std::localtime può provocare gare di dati. localtime_r o funzioni simili potrebbero essere disponibili sulle tue piattaforme.

Aggiornamento:

Utilizzo di una nuova versione di Howard Hinnant di date library si può scrivere:

#include "date.h" 
#include <chrono> 
#include <string> 
#include <sstream> 

std::string return_current_time_and_date() { 
    auto now = std::chrono::system_clock::now(); 
    auto today = date::floor<days>(now); 

    std::stringstream ss; 
    ss << today << ' ' << date::make_time(now - today) << " UTC"; 
    return ss.str(); 
} 

questo stampa qualcosa come "2015/07/24 05: 15: 34,043,473124 millions UTC".


Su una nota indipendenti, tornando const oggetti è diventato indesiderabile con C++ 11; i valori di ritorno const non possono essere spostati da. Ho rimosso anche il const finale perché il const finale è valido solo per le funzioni membro e questa funzione non ha bisogno di essere membro.

+7

Attenzione che alcuni vecchi compilatori potrebbero non riconoscere 'std :: put_time'. Una volta che ho provato a compilare il mio codice che aveva 'std :: put_time' su CentOS 7 usando g ++, non è riuscito. Stato del supporto 'std :: put_time' in GCC http://stackoverflow.com/q/14136833/4694036 – LETs

+2

Aggiornamento impressionante. +1 ;-) –

+0

c'è una funzione C++ simile a std :: put_time ma per restituire una stringa? – Nick