2013-05-03 20 views
48

schrieb ich eine Funktion, um ein aktuelles Datum und die Uhrzeit im Format zu erhalten: DD-MM-YYYY HH:MM:SS. Es funktioniert, aber sagen wir mal, es ist ziemlich hässlich. Wie kann ich genau das gleiche tun aber einfacher?Aktuelles Datum und Uhrzeit als String

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

Wäre es nicht einfacher zu verwenden ['std :: strftime'] (http://en.cppreference.com/ w/cpp/chrono/c/strftzeit)? –

+0

[Boost-- Datum Zeit] (http://www.boost.org/doc/libs/1_53_0/doc/html/date_time/examples.html#date_time.examples.dates_as_strings) – M456

Antwort

92

Nicht C++ 11-Lösung: Mit den <ctime> Header, könnten Sie strftime verwenden. Stellen Sie sicher, dass Ihr Puffer groß genug ist, dass Sie ihn nicht überlaufen und später verheeren wollen.

#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

Und was ist, wenn es den Puffer überläuft? Ich nehme an, es sollte einen Rückgabewert zu "strftime" geben, den Sie in echtem Code no überprüfen müssen? –

+2

Es wird nicht viel Zeit für eine gegebene Formatzeichenfolge benötigt, um eine maximal mögliche Stringlänge zu berechnen. –

+0

Ich verstehe nicht, warum Sie Rawtime nach Wert in der 10. Zeile von oben übergeben können, da die Zeit einen Zeiger auf einen time_t-Typ akzeptiert: http://www.cplusplus.com/reference/ctime/time/ In dem Beispiel auf dieser Seite benutzten sie die Zeit() genauso wie ich sie nicht verstehe. Kann mir das jemand erklären? –

103

Da C++ 11 Sie std::put_time von iomanip Header verwenden:

#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 ist ein Stream-Manipulator, daher könnte es zusammen mit std::ostringstream verwendet werden, um das Datum in eine Zeichenfolge zu konvertieren :

+32

'std :: put_time' fehlt noch in gcc 4.9. –

+4

gcc 5.0 hat es, aber nicht die früheren Versionen. – SmallChess

+0

@soon Ich habe eine Frage. In meinem Code habe ich eine Funktion, die eine Uhrzeit zurückgeben soll. Was sollte der Rückgabetyp einer Funktion sein, die die aktuelle Uhrzeit zurückgibt? –

21

können Sie asctime() Funktion von time.h verwenden, um eine Zeichenfolge einfach zu erhalten.

time_t _tm =time(NULL); 

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

Beispielausgabe:

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

Nein, Sie können nicht: asctime liefert nicht das in der Frage angeforderte Datum/Uhrzeit-Format! – Aconcagua

+2

@Aconcagua Während es nicht, gibt es Ihnen Zeit in einer Zeichenfolge. Der Code ist sauber und prägnant. – SmallChess

+3

Sauberer und prägnanter Code hilft nicht, wenn er nicht das bietet, was man will oder braucht. Willst du einen LKW (String), bekommst du einen. Um Flüssigkeiten transportieren zu können, braucht man einen Tankwagen und wird nicht glücklich sein, einen Muldenkipper zu bekommen ... – Aconcagua

1

Ich wollte die C++ 11 Antwort verwenden, aber ich konnte nicht, weil GCC 4.9 nicht std :: put_time unterstützen.

std::put_time implementation status in GCC?

I beendet die Nicht-C++ 11 Antwort leicht zu verbessern mit einigen C++ 11 bis. Für diejenigen, die 5 GCC verwenden können nicht, aber möchte noch einige C++ 11 in ihrem Datums-/Uhrzeitformat:

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

Verwendung von C++ in MS Visual Studio 2015 (14), die ich benutze:

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