Gibt es eine Möglichkeit, eine umzuwandeln time_t
zu einem std::string
mit dem format JJJJ-MM-TT HH:MM:SS automatisch, während der Code portabel bleibt?
C – Konvertiere time_t in einen String mit dem Format YYYY-MM-DD HH:MM:SS
dmessf
Verwenden localtime
die umzuwandeln time_t
zu einem struct tm
. Sie können verwenden strftime
um daraus die gewünschten Daten zu drucken.
char buff[20];
time_t now = time(NULL);
strftime(buff, 20, "%Y-%m-%d %H:%M:%S", localtime(&now));
-
+1 gute Antwort. Verwenden Sie jedoch localtime_r(), falls Ihr Code jemals in einer wiedereintrittsfähigen Umgebung verwendet wird.
– Amardeep AC9MF
16. Juni 2010 um 14:19 Uhr
-
@Amardeep: Er hat ausdrücklich um Portabilität gebeten, und
localtime_r
kann sich in dieser Hinsicht nicht qualifizieren (hängt davon ab, welche Ziele ihm wichtig sind).– Jerry Sarg
16. Juni 2010 um 14:22 Uhr
-
localtime_r ist zu diesem Zeitpunkt seit 18 Jahren Teil von POSIX. Ich denke, es ist sicher anzunehmen, dass es verfügbar sein wird.
– Arran Cudbard-Bell
30. August 2015 um 3:06 Uhr
-
@ArranCudbard-Bell: Zumindest aus meiner Sicht ist die Beschränkung auf POSIX im Wesentlichen gleichbedeutend mit “nicht portabel”. Es gibt kein einziges Betriebssystem mit einem ausreichend großen Marktanteil, um es zu bemerken, das einen ernsthaften Versuch unternimmt, POSIX genau zu implementieren (und ja, ich kenne Linux, bin mir aber bewusst, dass seine POSIX-Konformität bestenfalls lückenhaft ist).
– Jerry Sarg
1. Juli 2016 um 15:51 Uhr
-
@JerryCoffin was würdest du dann als tragbar betrachten? … und nicht nur Linux, *BSD, Solaris (ish), OSX und sogar Windows (ish) bieten POSIX-konforme APIs. Insbesondere für Netzwerke sind sie nicht zu 100 % identisch/konform, aber für einfache Hilfsfunktionen wie strlen, time, localtime sind sie ziemlich ähnlich, wenn nicht identisch, in der Art und Weise, wie sie die POSIX-Standards interpretieren.
– Arran Cudbard-Bell
1. Juli 2016 um 18:59 Uhr
Ihre einzige wirkliche Option aus dem Kopf ist, entweder Ihre eigene Routine zu schreiben oder die in POSIX.1/C90 definierte Funktion ctime() zu verwenden. ctime() ist sicherlich einen Blick wert, aber wenn Ihr Datum nicht bereits in der richtigen Zeitzone liegt, werden Sie auf Probleme stoßen.
BEARBEITEN: Ich habe nicht daran gedacht, die Ortszeit zu verwenden, wie unten von Jerry erwähnt. Wenn Sie es in ein struct tm konvertieren, haben Sie mehr Möglichkeiten, einschließlich der von ihm erwähnten und strptime().
-
Nein, strftime wurde erwähnt, strptime jedoch nicht, es handelt sich um zwei separate (aber ähnliche) Funktionen. Während strftime Teil von C90 ist, ist strptime jedoch nicht vorhanden. Wenn es also auf den Zielplattformen nicht vorhanden ist, ignorieren Sie diesen Teil.
– Jer
16. Juni 2010 um 17:38 Uhr