Ich habe alten Code aktualisiert und versucht, nach Möglichkeit auf c ++ 11 zu aktualisieren. Mit dem folgenden Code habe ich Uhrzeit und Datum in meinem Programm angezeigt
#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;
}
Ich möchte die aktuelle Uhrzeit und das aktuelle Datum in einem ähnlichen Format mit std :: chrono (oder ähnlichem) ausgeben, bin mir aber nicht sicher, wie ich das machen soll. Jede Hilfe wäre sehr dankbar. Vielen Dank
Antworten:
Die
<chrono>
Bibliothek befasst sich nur mit Zeit und nicht mit Datumsangaben, mit Ausnahmesystem_clock
derjenigen, in die die Zeitpunkte konvertiert werden könnentime_t
. Die Verwendung<chrono>
für Datumsangaben wird die Dinge also nicht wesentlich verbessern. Hoffentlich bekommen wir so etwas wiechrono::date
in nicht allzu ferner Zukunft.Das heißt, Sie können
<chrono>
auf folgende Weise verwenden:#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(); }
Beachten Sie, dass dies zu
std::localtime
Datenrennen führen kann.localtime_r
oder ähnliche Funktionen sind möglicherweise auf Ihren Plattformen verfügbar.Aktualisieren:
Mit einer neuen Version von Howard Hinnant des aktuellen Bibliothek Sie schreiben können:
#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(); }
Dies wird so etwas wie "2015-07-24 05: 15: 34.043473124 UTC" ausdrucken.
Unabhängig davon ist die Rückgabe von
const
Objekten mit C ++ 11 unerwünscht geworden. const Rückgabewerte können nicht verschoben werden. Ich habe auch die nachfolgende Konstante entfernt, da die nachgestellte Konstante nur für Elementfunktionen gültig ist und diese Funktion kein Mitglied sein muss.quelle
std::put_time
. Nachdem ich versucht hatte, meinen Code unterstd::put_time
CentOS 7 mit g ++ zu kompilieren , schlug dies fehl. Status derstd::put_time
Unterstützung in GCC stackoverflow.com/q/14136833/4694036strftime
können Sie einen Puffer mit einer C-Zeichenfolge füllen. Die veraltete Funktionasctime
gibt eine C-Zeichenfolge in einem festen Zeitformat zurück.using namespace date;
das<< today
nicht.Ein Beispiel:
#include <iostream> #include <chrono> #include <ctime> std::string getTimeStr(){ std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); std::string s(30, '\0'); std::strftime(&s[0], s.size(), "%Y-%m-%d %H:%M:%S", std::localtime(&now)); return s; } int main(){ std::cout<<getTimeStr()<<std::endl; return 0; }
Ausgabe wie folgt:
quelle
Um auch Millisekunden zu erhalten, verwende ich die chrono- und C-Funktion localtime_r, die threadsicher ist (im Gegensatz zu std :: localtime).
#include <iostream> #include <chrono> #include <ctime> #include <time.h> #include <iomanip> int main() { std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); std::time_t currentTime = std::chrono::system_clock::to_time_t(now); std::chrono::milliseconds now2 = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()); struct tm currentLocalTime; localtime_r(¤tTime, ¤tLocalTime); char timeBuffer[80]; std::size_t charCount { std::strftime( timeBuffer, 80, "%D %T", ¤tLocalTime) }; if (charCount == 0) return -1; std::cout << timeBuffer << "." << std::setfill('0') << std::setw(3) << now2.count() % 1000 << std::endl; return 0; }
Für das Format: http://www.cplusplus.com/reference/ctime/strftime/
quelle
to_time_t
sie abschneiden, aber auch runden können.bames53-Lösungen sind gut, lassen sich aber auf meinem VS2017 nicht kompilieren. Die Lösung mit ctime wird nicht kompiliert, da die Ortszeit sehr veraltet ist. Der mit date.h wird nicht mit dem aktuellen Datum kompiliert. H Ich habe gerade github entfernt, obwohl die Dokumentation dies vorschreibt, da der heutige Tag nicht so gestreamt werden kann, wie er ist. Ich habe die Includes weggelassen, aber hier ist Code, der funktioniert:
void TimeTest() { auto n = std::chrono::system_clock::now(); auto in_time_t = std::chrono::system_clock::to_time_t(n); std::tm buf; localtime_s(&buf, &in_time_t); std::cout << std::put_time(&buf, "%Y-%m-%d %X") << std::endl; } // I just added date.h from this link's guthub to the project. // https://howardhinnant.github.io/date/date.html void TimeTest1() { auto now = std::chrono::system_clock::now(); auto today = floor<date::days>(std::chrono::system_clock::now()); std::cout << date::year_month_day{ today } << ' ' << date::make_time(now - today) << std::endl; } // output is // 2018-04-08 21:19:49 // 2018-04-08 18:19:49.8408289
Fühlen Sie sich frei, die bames53-Lösung zu reparieren und meine zu löschen. Mein Text passt einfach nicht in einen Kommentar. Ich bin sicher, es kann viele Menschen vor Trauer retten.
quelle
using date::operator<<;
, können Sie streamen,today
ohne es zu konvertierenyear_month_day
.usings
at Funktionsumfang sind ein guter Kompromiss, da Konflikte leichter zu kontrollieren sind, wenn sie auftreten. Mir ist klar, dass dies nicht perfekt ist, aber es ist das Beste, was für Stream-Einfügeoperatoren für std :: -Typen getan werden kann, die von Bibliotheken von Drittanbietern geschrieben wurden. Aber erst letzten Monat habe ich das C ++ - Komitee davon überzeugt, diesen Streaming-Operatornamespace std::chrono
für C ++ 20 einzusetzen, damit er von ADL gefunden wird. Dann wird es nicht mehr benötigtusing
.Sie können die Antwort von @ bames53 verbessern, indem Sie Boost lexical_cast anstelle von String-Stream-Manipulationen verwenden.
Folgendes mache ich:
#include <boost/lexical_cast.hpp> #include <ctime> std::string return_current_time_and_date() { auto current_time = std::time(0); return boost::lexical_cast<std::string>(std::put_time(std::gmtime(& current_time), "%Y-%m-%d %X")); }
quelle