647 Stimmen

Wie erhält man die aktuelle Zeit und das Datum in C++?

Gibt es eine plattformübergreifende Möglichkeit, das aktuelle Datum und die Uhrzeit in C++ abzurufen?

3 Stimmen

Wenn Ockonal noch aktiv ist, sollte er die akzeptierte Antwort auf den C++11-Ansatz ändern. Diese Frage scheint immer noch eine Menge Ansichten zu erhalten.

2 Stimmen

3 Stimmen

@JSQuareD Selbst wenn ich mir diese Frage jetzt nach all der Zeit ansehe, finde ich den C-Ansatz besser, indem ich die tm Struktur. Gibt der C++11-Ansatz nicht einfach den Unix-Zeitstempel (Zeit seit der Epoche) aus, obwohl die Frage nach Datum und Uhrzeit lautete?

906voto

Frederick The Fool Punkte 33140

In C++ 11 können Sie std::chrono::system_clock::now()

Beispiel (kopiert aus de.cppreference.com ):

#include <iostream>
#include <chrono>
#include <ctime>    

int main()
{
    auto start = std::chrono::system_clock::now();
    // Some computation here
    auto end = std::chrono::system_clock::now();

    std::chrono::duration<double> elapsed_seconds = end-start;
    std::time_t end_time = std::chrono::system_clock::to_time_t(end);

    std::cout << "finished computation at " << std::ctime(&end_time)
              << "elapsed time: " << elapsed_seconds.count() << "s" << 
              << std::endl;
}

Der Ausdruck sollte etwa so aussehen:

finished computation at Mon Oct  2 00:59:08 2017
elapsed time: 1.88232s

40 Stimmen

Dies sollte hochgestuft werden, weil es der portabelste und einfachste Weg in aktuellem C++ ist.

5 Stimmen

@Johannes, habe gerade meinen Beitrag hinzugefügt. Bei diesem Tempo sollte dies die Top-Antwort bis zum 15. August 2017, 16:31 UTC sein :-)

72 Stimmen

Diese Antwort ist ohne Beispiele für die Verwendung des erhaltenen Wertes sehr wenig hilfreich. Wie kann man ihn z. B. ausdrucken, die Ortszeit ermitteln, mit einem anderen Datum/Uhrzeit vergleichen?

545voto

C++ teilt seine Datum/Uhrzeit-Funktionen mit C. Die tm-Struktur ist für einen C++-Programmierer wahrscheinlich am einfachsten zu handhaben - das folgende gibt das heutige Datum aus:

#include <ctime>
#include <iostream>

int main() {
    std::time_t t = std::time(0);   // get time now
    std::tm* now = std::localtime(&t);
    std::cout << (now->tm_year + 1900) << '-' 
         << (now->tm_mon + 1) << '-'
         <<  now->tm_mday
         << "\n";
}

28 Stimmen

Utilice ctime() zusammen mit dieser Antwort, wenn Sie eine Datumszeichenfolge wünschen.

3 Stimmen

Was ist mit dem Löschen der Instanz von struct tm Ist es möglich, einfach "Löschen" aufzurufen?

5 Stimmen

@Petr Sie brauchen nur den mit new zugewiesenen Speicher zu löschen.

223voto

TrungTN Punkte 2282

Sie können den folgenden plattformübergreifenden Code ausprobieren, um das aktuelle Datum/die aktuelle Uhrzeit zu ermitteln:

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

// Get current date/time, format is YYYY-MM-DD.HH:mm:ss
const std::string currentDateTime() {
    time_t     now = time(0);
    struct tm  tstruct;
    char       buf[80];
    tstruct = *localtime(&now);
    // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime
    // for more information about date/time format
    strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);

    return buf;
}

int main() {
    std::cout << "currentDateTime()=" << currentDateTime() << std::endl;
    getchar();  // wait for keyboard input
}

Ausgabe:

currentDateTime()=2012-05-06.21:47:59

Bitte besuchen Sie aquí für weitere Informationen über das Datums-/Zeitformat

0 Stimmen

Hallo. Ich habe ein kleines Problem mit dieser "buf" Zuordnung innerhalb der Funktion "currentDateTime()". Wie soll sie bestehen bleiben, nachdem die Funktion zurückgekehrt ist? Thx.

10 Stimmen

Der Rückgabetyp ist "const std::string", d.h. er wird als Wert zurückgegeben und dann wird eine Kopie des Puffers erstellt, bevor er freigegeben wird.

5 Stimmen

Warum zurückkehren const Wert? Das ist zwecklos.

142voto

Martin York Punkte 245363

Std C-Bibliotheken bieten time() . Dies sind Sekunden ab der Epoche und können in Datum und H:M:S mit Standard-C-Funktionen. Boost hat auch eine Zeit/Datum-Bibliothek die Sie überprüfen können.

time_t  timev;
time(&timev);

24 Stimmen

Die folgende Antwort von anon ist besser strukturiert und liefert ein besseres Beispiel.

4 Stimmen

Außerdem fragte er nach C++ und nicht nach C.

4 Stimmen

@jterm seine ok, C und C + + teilen die genaue gleiche Zeit Bibliothek, es ist eine Frage der verschiedenen Namen importieren und das ist es

51voto

Howard Hinnant Punkte 191035

Neue Antwort auf eine alte Frage:

In der Frage wird nicht angegeben, in welcher Zeitzone. Es gibt zwei vernünftige Möglichkeiten:

  1. In UTC.
  2. In der lokalen Zeitzone des Computers.

Für 1 können Sie verwenden dieses Datum Bibliothek und das folgende Programm:

#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << system_clock::now() << '\n';
}

Die nur für mich ausgeben:

2015-08-18 22:08:18.944211

Die Datumsbibliothek fügt im Wesentlichen nur einen Streaming-Operator für std::chrono::system_clock::time_point . Es fügt auch eine Menge anderer netter Funktionen hinzu, die aber in diesem einfachen Programm nicht verwendet werden.

Wenn Sie 2 (die Ortszeit) bevorzugen, gibt es eine Zeitzonen-Bibliothek die auf der Grundlage der Terminbibliothek . Diese beiden Bibliotheken sind offene Quelle y plattformübergreifend vorausgesetzt, der Compiler unterstützt C++11 oder C++14.

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    auto local = make_zoned(current_zone(), system_clock::now());
    std::cout << local << '\n';
}

Die für mich nur Ausgang:

2015-08-18 18:08:18.944211 EDT

Der Ergebnistyp von make_zoned ist eine date::zoned_time was eine Paarung von a date::time_zone und eine std::chrono::system_clock::time_point . Dieses Paar steht für eine Ortszeit, kann aber auch für UTC stehen, je nachdem, wie Sie es abfragen.

Anhand der obigen Ausgabe können Sie sehen, dass sich mein Computer derzeit in einer Zeitzone mit einem UTC-Offset von -4h und einer Abkürzung von EDT befindet.

Wenn eine andere Zeitzone gewünscht wird, kann dies ebenfalls erreicht werden. Um zum Beispiel die aktuelle Zeit in Sydney, Australien zu finden, ändern Sie einfach die Konstruktion der Variablen local zu:

auto local = make_zoned("Australia/Sydney", system_clock::now());

Und die Ausgabe ändert sich zu:

2015-08-19 08:08:18.944211 AEST

Aktualisierung für C++20

Diese Bibliothek wird nun weitgehend für C++20 übernommen. Der Namensraum date ist verschwunden, und alles befindet sich im Namespace std::chrono jetzt. Und verwenden zoned_time anstelle von make_time . Die Kopfzeilen weglassen "date.h" y "tz.h" und verwenden Sie einfach <chrono> .

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    auto local = zoned_time{current_zone(), system_clock::now()};
    std::cout << local << '\n';  // 2021-05-03 15:02:44.130182 EDT
}

Während ich dies schreibe, tauchen auf einigen Plattformen gerade erst Teilimplementierungen auf.

0 Stimmen

Sollte nicht localtime mir die Uhrzeit in meiner Zeitzone geben?

0 Stimmen

Ja, localtime wird fast gibt Ihnen immer die Zeit in Ihrer lokalen Zeitzone auf die Sekunde genau an. Manchmal scheitert es an Problemen mit der Threadsicherheit, und es wird nie mit einer Genauigkeit von weniger als einer Sekunde funktionieren.

1 Stimmen

Es wäre gut, wenn Sie auch die Aktualisierung für UTC bereitstellen könnten. Denn das Offensichtliche std::cout << std::chrono::system_clock::now(); scheitert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X