Wie bekomme ich den Unix-Zeitstempel in C als Int?

Lesezeit: 4 Minuten

Benutzeravatar von Tim
Tim

Ich möchte den aktuellen Zeitstempel erhalten und mit ausdrucken fprintf.

  • Gibt es einen bestimmten Grund, warum es speziell ein int sein muss?

    – Dennis Meng

    1. August 2012 um 18:29 Uhr

  • @DennisMeng Wenn ich raten müsste, wollte er wahrscheinlich den Zeitstempel als Rückgabecode erhalten und die Ausgabeverarbeitung ausschalten.

    – kayleeFrye_onDeck

    7. Januar 2017 um 11:09 Uhr

  • Tut mir leid, das zu necrobumpen, aber technisch Alle diese Antworten sind seitdem falsch time ist nicht garantiert seit der Unix-Epoche; Laut Wikipedia kann es jede Epoche sein, die der Anbieter auswählt. Es heißt auch, dass manchmal 1900 verwendet wird. Ich würde jedoch davon ausgehen, dass dies seit der Unix-Epoche auf allen auch nur annähernd gesunden Systemen der Fall ist.

    – markasoftware

    25. Mai 2017 um 1:10 Uhr

Benutzeravatar von Dmitry Poroh
Dimitri Poroh

Für 32-Bit-Systeme:

fprintf(stdout, "%u\n", (unsigned)time(NULL)); 

Für 64-Bit-Systeme:

fprintf(stdout, "%lu\n", (unsigned long)time(NULL)); 

  • Was wäre, wenn ich es in Mikrosekunden wollte?

    – Tim

    1. August 2012 um 21:26 Uhr

  • Wenn Sie Mikrosekunden möchten, sollten Sie eine dieser Funktionen verwenden: clock_gettime mit CLOCK_MONOTONIC-Uhr-ID oder gettimeofday. Beachten Sie jedoch, dass gettimeofday abnehmende Zeitwerte zurückgeben kann.

    – Dmitri Poroh

    1. August 2012 um 21:34 Uhr

  • Beachten Sie, dass die Zeitfunktion (und clock_gettime mit der CLOCK_REALTIME-ID) auch die Uhrzeit der Wanduhr zurückgibt und abnehmende Zeitstempel zurückgeben kann.

    – Dmitri Poroh

    2. August 2012 um 4:56 Uhr

  • Sie können die Typumwandlung vermeiden, indem Sie die richtige Konvertierungsspezifikation angeben. Du kannst was lernen time_t (zurückgegeben von time) wird aufgelöst, indem der Präprozessor für Ihre C-Datei ausgeführt wird (cpp main.c). Auf meinem 64-Bit-System time_t ist long intwas dazu führt %ld Konvertierungsspezifikation.

    – x-yuri

    18. Oktober 2017 um 20:39 Uhr

  • #include <time.h>

    – Ben

    3. September 2018 um 19:10 Uhr

Benutzeravatar von Daniel Fischer
Daniel Fischer

Castet nur den Wert, der von zurückgegeben wird time()

#include <stdio.h>
#include <time.h>

int main(void) {
    printf("Timestamp: %d\n",(int)time(NULL));
    return 0;
}

was willst du?

$ gcc -Wall -Wextra -pedantic -std=c99 tstamp.c && ./a.out
Timestamp: 1343846167

Um Mikrosekunden seit der Epoche ab C11 zu erhalten, ist der tragbare Weg zu verwenden

int timespec_get(struct timespec *ts, int base)

Leider ist C11 noch nicht überall verfügbar, daher ist die Verwendung einer der POSIX-Funktionen ab sofort am nächsten an Portable clock_gettime oder gettimeofday (in POSIX.1-2008 als veraltet markiert, was empfohlen wird clock_gettime).

Der Code für beide Funktionen ist nahezu identisch:

#include <stdio.h>
#include <time.h>
#include <stdint.h>
#include <inttypes.h>

int main(void) {

    struct timespec tms;

    /* The C11 way */
    /* if (! timespec_get(&tms, TIME_UTC)) { */

    /* POSIX.1-2008 way */
    if (clock_gettime(CLOCK_REALTIME,&tms)) {
        return -1;
    }
    /* seconds, multiplied with 1 million */
    int64_t micros = tms.tv_sec * 1000000;
    /* Add full microseconds */
    micros += tms.tv_nsec/1000;
    /* round up if necessary */
    if (tms.tv_nsec % 1000 >= 500) {
        ++micros;
    }
    printf("Microseconds: %"PRId64"\n",micros);
    return 0;
}

  • Was wäre, wenn ich es in Mikrosekunden wollte?

    – Tim

    1. August 2012 um 21:26 Uhr

  • Das würde das bedeuten int ist nicht auf fast (?) allen gängigen Systemen der passende Typ. Mit typisch INT_MAX = 2147483647wenn Sie Mikrosekunden wollen, passen Sie einfach etwas weniger als 36 Minuten hinein int. Und natürlich können Sie im Allgemeinen nicht verwenden time() dann. Portabel müsstest du verwenden timespec_get() dann. Was willst du? Unix-Zeitstempel oder Mikrosekunden (seit Epoche)?

    – Daniel Fischer

    1. August 2012 um 21:39 Uhr

  • Mikrosekunden seit der Epoche wären die besten.

    – Tim

    1. August 2012 um 23:47 Uhr

  • Mikrosekunden erledigt, das habe ich leider entdeckt timespec_get ist neu in C11, daher ist Portabilität ein Problem.

    – Daniel Fischer

    2. August 2012 um 0:27 Uhr

Mit Sekundengenauigkeit können Sie drucken tv_sec Bereich timeval Struktur, von der Sie kommen gettimeofday() Funktion. Zum Beispiel:

#include <sys/time.h>
#include <stdio.h>

int main()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    printf("Seconds since Jan. 1, 1970: %ld\n", tv.tv_sec);
    return 0;
}

Beispiel zum Kompilieren und Ausführen:

$ gcc -Wall -o test ./test.c 
$ ./test 
Seconds since Jan. 1, 1970: 1343845834

Beachten Sie jedoch, dass seit Epoche und so eine Weile vergangen ist long int wird heutzutage verwendet, um eine Anzahl von Sekunden einzufügen.

Es gibt auch Funktionen zum Drucken menschenlesbarer Zeiten. Sehen diese Handbuchseite für Details. Hier ist ein Beispiel mit ctime():

#include <time.h>
#include <stdio.h>

int main()
{
    time_t clk = time(NULL);
    printf("%s", ctime(&clk));
    return 0;
}

Beispiellauf & Ausgabe:

$ gcc -Wall -o test ./test.c 
$ ./test 
Wed Aug  1 14:43:23 2012
$ 

  • Und gettimeofday ist der eigentliche Linux-Systemaufruf.

    – Ciro Santilli OurBigBook.com

    7. Oktober 2017 um 2:55 Uhr

#include <stdio.h>
#include <time.h>

int main ()
{
   time_t seconds;

   seconds = time(NULL);
   printf("Seconds since January 1, 1970 = %ld\n", seconds);

   return(0);
}

Und wird ein ähnliches Ergebnis erhalten:
Sekunden seit dem 1. Januar 1970 = 1476107865

Benutzeravatar von fralbo
fralbo

Ein wichtiger Punkt ist zu überlegen, ob Sie Aufgaben basierend auf der Differenz zwischen 2 Zeitstempeln ausführen, da Sie ein merkwürdiges Verhalten erhalten, wenn Sie sie mit generieren gettimeofday()und sogar clock_gettime(CLOCK_REALTIME,..) in dem Moment, in dem Sie die Uhrzeit Ihres Systems einstellen.

Um solche Probleme zu vermeiden, verwenden Sie clock_gettime(CLOCK_MONOTONIC_RAW, &tms) stattdessen.

1416710cookie-checkWie bekomme ich den Unix-Zeitstempel in C als Int?

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

Privacy policy