Was ist die beste Methode, um die Zeit in C im Format auszudrucken 2009‐08‐10
18:17:54.811
?
Was ist die beste Methode, um die Zeit in C im Format auszudrucken 2009‐08‐10
18:17:54.811
?
Antworten:
Verwenden Sie strftime () .
#include <stdio.h>
#include <time.h>
int main()
{
time_t timer;
char buffer[26];
struct tm* tm_info;
timer = time(NULL);
tm_info = localtime(&timer);
strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
puts(buffer);
return 0;
}
Schauen Sie sich diese Frage für Millisekunden an. Wie messe ich die Zeit in Millisekunden mit ANSI C?
time(&timer)
eher sein timer = time(NULL);
, zumindest für Linux. The tloc argument is obsolescent and should always be NULL in new code. When tloc is NULL, the call cannot fail.
Die obigen Antworten beantworten die Frage nicht vollständig (insbesondere den Millisekunden-Teil). Meine Lösung hierfür ist, gettimeofday vor strftime zu verwenden. Beachten Sie die Vorsicht, um zu vermeiden, dass Millisekunden auf "1000" gerundet werden. Dies basiert auf der Antwort von Hamid Nazari.
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <math.h>
int main() {
char buffer[26];
int millisec;
struct tm* tm_info;
struct timeval tv;
gettimeofday(&tv, NULL);
millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec
if (millisec>=1000) { // Allow for rounding up to nearest second
millisec -=1000;
tv.tv_sec++;
}
tm_info = localtime(&tv.tv_sec);
strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", tm_info);
printf("%s.%03d\n", buffer, millisec);
return 0;
}
gettimeofday
ist bei Windows-Implementierungen nicht verfügbar
time.h
definiert eine strftime
Funktion, die Ihnen eine Textdarstellung einer time_t
Verwendung von etwas geben kann wie:
#include <stdio.h>
#include <time.h>
int main (void) {
char buff[100];
time_t now = time (0);
strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now));
printf ("%s\n", buff);
return 0;
}
Aber das gibt Ihnen keine Auflösung von weniger als einer Sekunde, da diese nicht von a erhältlich ist time_t
. Es gibt aus:
2010-09-09 10:08:34.000
Wenn Sie durch die Spezifikationen wirklich eingeschränkt sind und den Abstand zwischen Tag und Stunde nicht möchten, entfernen Sie ihn einfach aus der Formatzeichenfolge.
Der folgende Code wird mit Mikrosekundengenauigkeit gedruckt. Alles, was wir tun müssen, ist , den erstellten String zu verwenden gettimeofday
und strftime
an ihn tv_sec
anzuhängen tv_usec
.
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main(void) {
struct timeval tmnow;
struct tm *tm;
char buf[30], usec_buf[6];
gettimeofday(&tmnow, NULL);
tm = localtime(&tmnow.tv_sec);
strftime(buf,30,"%Y:%m:%dT%H:%M:%S", tm);
strcat(buf,".");
sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
strcat(buf,usec_buf);
printf("%s",buf);
return 0;
}
Sie könnten verwenden strftime
, haben aber struct tm
keine Auflösung für Teile von Sekunden. Ich bin mir nicht sicher, ob dies für Ihre Zwecke unbedingt erforderlich ist.
struct tm tm;
/* Set tm to the correct time */
char s[20]; /* strlen("2009-08-10 18:17:54") + 1 */
strftime(s, 20, "%F %H:%M:%S", &tm);
Trick:
int time_len = 0, n;
struct tm *tm_info;
struct timeval tv;
gettimeofday(&tv, NULL);
tm_info = localtime(&tv.tv_sec);
time_len+=strftime(log_buff, sizeof log_buff, "%y%m%d %H:%M:%S", tm_info);
time_len+=snprintf(log_buff+time_len,sizeof log_buff-time_len,".%03ld ",tv.tv_usec/1000);
Keine der Lösungen auf dieser Seite hat für mich funktioniert. Ich habe sie verwechselt und mit Windows und Visual Studio 2019 kompatibel gemacht.
#include <Windows.h>
#include <time.h>
#include <chrono>
static int gettimeofday(struct timeval* tp, struct timezone* tzp) {
namespace sc = std::chrono;
sc::system_clock::duration d = sc::system_clock::now().time_since_epoch();
sc::seconds s = sc::duration_cast<sc::seconds>(d);
tp->tv_sec = s.count();
tp->tv_usec = sc::duration_cast<sc::microseconds>(d - s).count();
return 0;
}
static char* getFormattedTime() {
static char buffer[26];
// For Miliseconds
int millisec;
struct tm* tm_info;
struct timeval tv;
// For Time
time_t rawtime;
struct tm* timeinfo;
gettimeofday(&tv, NULL);
millisec = lrint(tv.tv_usec / 1000.0);
if (millisec >= 1000)
{
millisec -= 1000;
tv.tv_sec++;
}
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", timeinfo);
sprintf_s(buffer, 26, "%s.%03d", buffer, millisec);
return buffer;
}
Ergebnis:
2020: 08: 02 06: 41: 59.107
2020: 08: 02 06: 41: 59.196