Gibt es eine plattformübergreifende Möglichkeit, das aktuelle Datum und die Uhrzeit in C++ abzurufen?
Dies sollte hochgestuft werden, weil es der portabelste und einfachste Weg in aktuellem C++ ist.
Gibt es eine plattformübergreifende Möglichkeit, das aktuelle Datum und die Uhrzeit in C++ abzurufen?
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
Dies sollte hochgestuft werden, weil es der portabelste und einfachste Weg in aktuellem C++ ist.
@Johannes, habe gerade meinen Beitrag hinzugefügt. Bei diesem Tempo sollte dies die Top-Antwort bis zum 15. August 2017, 16:31 UTC sein :-)
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?
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";
}
Was ist mit dem Löschen der Instanz von struct tm
Ist es möglich, einfach "Löschen" aufzurufen?
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
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.
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.
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);
Neue Antwort auf eine alte Frage:
In der Frage wird nicht angegeben, in welcher Zeitzone. Es gibt zwei vernünftige Möglichkeiten:
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
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.
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.
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 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.
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
C-Version: stackoverflow.com/questions/1442116/
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?5 Stimmen
Wow, diese Frage hat 1.110.886 Aufrufe! Die Leute lieben C++ wirklich!
5 Stimmen
Nein, sie hassen nur ::std::chrono. Es ist unentzifferbares Kauderwelsch.