2013-05-03 13 views
48

Napisałem funkcję, aby uzyskać bieżącą datę i godzinę w formacie: DD-MM-YYYY HH:MM:SS. Działa, ale załóżmy, że jest dość brzydka. Jak mogę zrobić dokładnie to samo, ale prostsze?Bieżąca data i czas w postaci ciągu znaków

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; 
} 
+2

http://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html – Mat

+0

Czy nie byłoby prostsze korzystanie ze ['std :: strftime'] (http://en.cppreference.com/ w/cpp/chrono/c/strftime)? –

+0

[Wzmocnienie - Data czasu] (http://www.boost.org/doc/libs/1_53_0/doc/html/date_time/examples.html#date_time.examples.dates_as_strings) – M456

Odpowiedz

92

dla C++ 11 Rozwiązanie: W nagłówku <ctime>, można użyć strftime. Upewnij się, że twój bufor jest wystarczająco duży, nie chciałbyś go przejąć i siać spustoszenie później.

#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 %I:%M:%S",timeinfo); 
    std::string str(buffer); 

    std::cout << str; 

    return 0; 
} 
+2

A co, jeśli przepełni bufor? Przypuszczam, że powinna być wartość zwracana do 'strftime', które trzeba sprawdzić w prawdziwym kodzie nie? –

+2

Nie trzeba wiele myśleć, aby dowolny ciąg formatu obliczyć maksymalną możliwą długość ciągu. –

+0

Nie rozumiem, dlaczego możesz przekazać rawtime przez wartość w 10. linii od góry, ponieważ czas przenosi wskaźnik do typu time_t: http://www.cplusplus.com/reference/ctime/time/ W przykładzie na tej stronie użyli czasu() w ten sam sposób, którego nie rozumiem. Czy ktoś może mi to wyjaśnić? –

103

Ponieważ C++ 11 można użyć std::put_timeiomanip z nagłówkiem:

#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 jest strumień manipulator, dlatego mogą być używane razem z std::ostringstream aby przekonwertować datę na ciąg :

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

'std :: put_time' wciąż brakuje w gcc 4.9. –

+4

gcc 5.0 ma to, ale nie wcześniejsze wersje. – SmallChess

+0

@soon Mam pytanie. W moim kodzie mam funkcję, która ma zwrócić czas. Jaki powinien być typ zwracany funkcji, która zwraca bieżący czas? –

21

można użyć funkcji asctime() funkcji time.h, aby uzyskać prosty ciąg znaków.

time_t _tm =time(NULL); 

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

Przykładowe wyjście:

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

Nie, nie możesz: asctime nie dostarcza żądanego formatu daty/czasu! – Aconcagua

+2

@Aconcagua Mimo że nie ma, daje czas w ciągu znaków. Kod jest czysty i zwięzły. – SmallChess

+3

Czysty i zwięzły kod nie pomaga, jeśli nie zapewnia tego, czego się chce lub potrzebuje. Chcesz ciężarówkę (ciąg), otrzymasz jeden. Chcąc transportować płyny, potrzebujesz cysterny i nie będziesz zadowolony z wyrzucenia ciężarówki ... – Aconcagua

1

chciałem użyć C++ 11 odpowiedzi, ale nie mogłem, ponieważ GCC 4.9 nie obsługuje std :: put_time.

std::put_time implementation status in GCC?

skończyło się używając niektóre C++ 11 nieznacznie poprawić non-C++ 11 odpowiedzi. Dla tych, którzy nie mogą korzystać z GCC 5, ale nadal jak niektórzy C++ 11 w ich format daty/godziny:

std::array<char, 64> buffer; 
buffer.fill(0); 
time_t rawtime; 
time(&rawtime); 
const auto timeinfo = localtime(&rawtime); 
strftime(buffer.data(), sizeof(buffer), "%d-%m-%Y %H-%M-%S", timeinfo); 
std::string timeStr(buffer.data()); 
1

Korzystanie C++ w MS Visual Studio 2015 (14), używam:

#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; 
} 
Powiązane problemy