So drucken Sie die Zeit im Format: 2009-08-10 18:17:54.811

Lesezeit: 6 Minuten

Benutzeravatar von Dominic Bou-Samra
Dominic Bou-Samra

Was ist die beste Methode, um die Zeit in C im Format auszudrucken 2009‐08‐10 
18:17:54.811?

Benutzeravatar von Hamid Nazari
Hamed Nazari

Verwenden 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;
}

Sehen Sie sich diese Frage für Millisekunden an. Wie misst man die Zeit in Millisekunden mit ANSI C?

  • Es ist jetzt eine noch bessere Antwort und Requisiten, um nachzuschlagen, wie man mit dem Millisekundenteil umgeht. Ich denke jedoch, dass Ihr Puffer jetzt etwas länger ist, als er sein muss.

    – Jack Kelly

    9. September 2010 um 3:56 Uhr

  • Lieber länger als kürzer 🙂

    – paxdiablo

    9. September 2010 um 4:12 Uhr

  • Super Antwort. Ich konnte alle möglichen Dinge in PHP machen, wusste aber, dass es alles schon in C gab. Danke.

    – Vijay Kumar Kanta

    23. Januar 2014 um 12:43 Uhr

  • Vielleicht die Linie time(&timer) sollte 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.

    – Antonin Décimo

    28. November 2016 um 16:39 Uhr


  • Die Antwort ist in mindestens einem Fall (Linux) definitiv falsch, da “struct tm”, das von localtime() verwendet wird, keine Zeitinformationen unter den Sekunden enthält. Stattdessen hat “struct timeval”, das von gettimeofday() verwendet wird, Mikrosekunden, die geteilt durch 1000 die Millisekunden ergeben. All diese Upvotes sind wirklich falsch und irreführend! Es sei denn jemand meldet unter welcher Architektur man Zeitangaben unterhalb der Sekunde mit “struct tm” bekommt.

    – EnzoR

    28. September 2017 um 10:10 Uhr


Die obigen Antworten beantworten die Frage nicht vollständig (insbesondere den Millisekundenteil). Meine Lösung hierfür ist die Verwendung von gettimeofday vor strftime. Achten Sie darauf, Millisekunden nicht auf “1000” zu runden. 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 in Windows-Implementierungen nicht verfügbar

    – Mendes

    30. Juni 2016 um 22:17 Uhr

  • Bitte fügen Sie ‘-lm’-Optionen hinzu, wenn Sie es erstellen.

    – Himmelszeichen

    3. August 2016 um 8:41 Uhr


  • Ich denke, dieser Puffer[24] ist genug, Grund ist wie unten, YYYY:MM:DD HH:MM:SS.mmm + ‘\0’, ist 24.

    – Himmelszeichen

    3. August 2016 um 8:47 Uhr


  • @Mendes, warum Windows erwähnen? Die Frage bezieht sich auf die einfache C-Sprache. Dies ist eine bessere Antwort (wenn auch nicht die richtige), trotz all dieser falschen Upvotes!

    – EnzoR

    28. September 2017 um 10:13 Uhr


  • user3624334 : Nein, du verstehst den Code nicht. Es gibt nur eine Zeitanfrage. Ich nehme an, Sie meinen den Aufruf der Ortszeit – er formatiert nur die Ausgabe von gettimeofday neu.

    – Chris

    25. November 2019 um 21:49 Uhr

Benutzeravatar von paxdiablo
paxdiablo

time.h definiert a strftime Funktion, die Ihnen eine Textdarstellung von a geben kann time_t mit so etwas 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 dies nicht von a verfügbar ist time_t. Es gibt aus:

2010-09-09 10:08:34.000

Wenn Sie durch die Spezifikationen wirklich eingeschränkt sind und das Leerzeichen zwischen Tag und Stunde nicht möchten, entfernen Sie es einfach aus der Formatzeichenfolge.

  • +1 für den sinnvollen Trick, die Anzeige auf die Millisekunde genau auszufüllen. Ich hatte einmal einen Kunden, der wollte, dass ich das tue, aber mit Ziffern ungleich Null, so dass es so aussah, als gäbe es dort eine Bedeutung. Ich habe es ihm ausgeredet, aber zugestimmt, Nullen einzusetzen.

    – RBerteig

    9. September 2010 um 7:22 Uhr

  • Ein Freund von mir (natürlich nicht ich) hat einmal einen ähnlichen Trick verwendet – sie haben Statiken beibehalten, die die letzte Sekunde und “Millisekunde” enthalten. Wo sich die Sekunde seit dem letzten Mal nicht geändert hatte, fügten sie einfach einen zufälligen Wert zwischen 1 und 200 zu Millisekunden hinzu (wobei natürlich darauf geachtet wurde, dass er nicht über 999 hinausging – das tatsächliche Maximum für den Rand() war immer das Minimum von 200 und der halbe Abstand zu 999). Wo sich die Sekunde geändert hat, haben sie vor dem Hinzufügen einfach Millisekunden auf 0 gesetzt. Schöne scheinbar zufällige, aber richtig sequenzierte Millisekunden und der Kunde war nicht klüger 🙂

    – paxdiablo

    9. September 2010 um 7:29 Uhr


Folgen Sie Codedrucken mit Mikrosekunden-Präzision. Alles, was wir tun müssen, ist zu verwenden gettimeofday und strftime an tv_sec und anhängen tv_usec zum konstruierten String.

#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;
}

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

  • Bitte erläutern Sie, warum dies funktioniert. und was genau los ist.

    – Raj Kamal

    10. März 2020 um 11:51 Uhr

  • Alles wie die obigen Beispiele, aber nur effektiver. ` time_len+=snprintf(log_buff+time_len,sizeof log_buff-time_len,”log var is=%s”,logvar); int ret = write(log_fd, log_buff, time_len); `

    – Андрей Мельников

    12. März 2020 um 11:17 Uhr


  • Woher importiere ich gettimeofday?

    – Andrej

    3. Juni 2020 um 18:45 Uhr

Du könntest benutzen strftimeaber struct tm hat keine Auflösung für Teile von Sekunden. Ich bin mir nicht sicher, ob das 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);

  • Bitte erläutern Sie, warum dies funktioniert. und was genau los ist.

    – Raj Kamal

    10. März 2020 um 11:51 Uhr

  • Alles wie die obigen Beispiele, aber nur effektiver. ` time_len+=snprintf(log_buff+time_len,sizeof log_buff-time_len,”log var is=%s”,logvar); int ret = write(log_fd, log_buff, time_len); `

    – Андрей Мельников

    12. März 2020 um 11:17 Uhr


  • Woher importiere ich gettimeofday?

    – Andrej

    3. Juni 2020 um 18:45 Uhr

Keine der Lösungen auf dieser Seite hat bei mir funktioniert, ich habe sie verwechselt und dafür gesorgt, dass sie mit Windows und Visual Studio 2019 funktionieren. So geht’s:

#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

1421860cookie-checkSo drucken Sie die Zeit im Format: 2009-08-10 18:17:54.811

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy