kam ich mit auf den Punkt:
char fmt[64], buf[64];
struct timeval tv;
struct tm *tm;
gettimeofday(&tv, NULL);
if((tm = localtime(&tv.tv_sec)) != NULL)
{
strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u %z", tm);
snprintf(buf, sizeof buf, fmt, tv.tv_usec);
printf("'%s'\n", buf);
}
Fixes für die Probleme, die Sie hatten:
- Verwenden
gettimeofday()
und struct timeval
, die für die höhere Präzision ein Mikroelement hat.
- Verwenden Sie einen zweistufigen Ansatz, bei dem wir zuerst eine Zeichenfolge erstellen, die alle Daten außer den Mikrosekunden enthält.
- Verwenden Sie für den Zeitzonenversatz das Kleinbuchstabe 'z'. Dies scheint eine GNU-Erweiterung zu sein.
ich versuchte erneute Erstellen der Zeitzone manuell durch das zweite Argument der struct timezone *
gettimeofday()
, aber auf meiner Maschine nicht korrekt kehrt die ein Offset von 0 versetzt ist. Die manual page für gettimefday()
hat ziemlich viel zu sagen über die Handhabung von Zeitzonen unter Linux (das ist das OS, das ich getestet habe).
'% z' ist immer noch nicht Standard =) – gnud
Danke, das ist das nächste, das ich bisher bekommen habe. Die '%% 06u' wirft gerade gerade Mülldaten auf mich zurück, aber der Rest funktioniert gut. P.S Ja, ich weiß, das% z ist nicht Standard, aber ich nehme es :) –
@aditya: Das ist seltsam ... Der obige Code sollte funktionieren. Stellen Sie sicher, dass Sie den zweiten snprintf() - Aufruf mit einem richtigen vorzeichenlosen Mikrosekundenwert für das% 06u-Format angeben. Sie können versuchen, das Ergebnis nach dem Aufruf von strftime() zu drucken. Sie sollten Ihre endgültige Ausgabe sehen, mit Ausnahme der Sequenz% 06u nach dem Punkt. – unwind