2009-10-11 4 views
7

Hier ist die Art Zeit Formatierung Ich bin nach:Mit strftime in C, wie kann ich Zeit genau wie ein Unix-Zeitstempel formatieren?

2009-10-08 04:31:33.918700000 -0500 

Ich verwende diese zur Zeit:

strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", ts); 

Welche gibt:

2009-10-11 13:42:57 CDT 

die in der Nähe ist, aber nicht genau. Ich kann nichts am Anzeigen -0500 am Ende finden. Außerdem bekomme ich die Sekunden als Int.

Wie kann ich diese beiden Probleme beheben?

Antwort

21

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).

+1

'% z' ist immer noch nicht Standard =) – gnud

+0

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 :) –

+0

@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

1

"%Y-%m-%d %T %z", aber es scheint %z ist eine GNU-Erweiterung.

+3

% T gibt die in der Frage verlangten untergeordneten Ziffern nicht an. – unwind