2013-06-20 31 views
39

Aktualizuję stary kod i staram się aktualizować do C++ 11 tam, gdzie to możliwe. Poniższy kod jest jak kiedyś, aby wyświetlić datę i czas w moim programieWydawanie daty i czasu w C++ przy użyciu 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; 
} 

chciałbym wyjście aktualny czas i datę w podobnym formacie za pomocą std :: chrono (lub podobne), ale jestem pewien, w jaki sposób aby to zrobić. Każda pomoc będzie wielce ceniona. Dzięki

+0

Proszę sprawdzić, czy jest już zadane takie pytanie, a jeśli nie, to zapytaj. – legends2k

+0

* Możliwe duplikaty: * http://stackoverflow.com/questions/12346260/c-date-and-time – legends2k

+3

Nie osiągniesz znacznie lepszego z C++ 11. Chrono to więcej informacji na temat czasu (ile czasu zajęło), niż rzeczy typu time-of-day. Możesz jednak sprawdzić Czas na Zwiększenie Daty. Ma bardziej niezawodną funkcję daty i czasu. –

Odpowiedz

63

Biblioteka dotyczy tylko czasu, a nie dat, z wyjątkiem system_clock, który ma możliwość konwersji punktów czasowych na . Używanie dat <chrono> nie poprawi wiele rzeczy. Mam nadzieję, że otrzymamy coś w rodzaju: chrono::date w niezbyt odległej przyszłości.

Powiedział, że można użyć <chrono> w następujący sposób:

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

Zauważ, że std::localtime może powodować wyścigi danych. localtime_r lub podobne funkcje mogą być dostępne na twoich platformach.

Aktualizacja:

Korzystanie z nowej wersji Howard Hinnant na date library można napisać:

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

ten wypisze coś jak "2015-07-24 05: 15: 34.043473124 UTC".


Na niepowiązanych notatki, wracając const obiektów stała niepożądana z C++ 11; nie można przesuwać wartości const return z. Usunąłem również ciąg końcowy, ponieważ końcowe const jest ważne tylko dla funkcji składowych i ta funkcja nie musi być członkiem.

+7

Uważaj, że niektóre stare kompilatory mogą nie rozpoznać 'std :: put_time'. Kiedyś próbowałem skompilować mój kod, który miał 'std :: put_time' na CentOS 7 używając g ++, to się nie udało. Stan obsługi 'std :: put_time' w GCC http://stackoverflow.com/q/14136833/4694036 – LETs

+2

Awesome update. +1 ;-) –

+0

czy istnieje funkcja C++ podobna do std :: put_time, ale do zwrócenia łańcucha? – Nick

Powiązane problemy