Ich möchte den aktuellen Zeitstempel erhalten und mit ausdrucken fprintf
.
Wie bekomme ich den Unix-Zeitstempel in C als Int?
Tim
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 vontime
) wird aufgelöst, indem der Präprozessor für Ihre C-Datei ausgeführt wird (cpp main.c
). Auf meinem 64-Bit-Systemtime_t
istlong int
was 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
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 typischINT_MAX = 2147483647
wenn Sie Mikrosekunden wollen, passen Sie einfach etwas weniger als 36 Minuten hineinint
. Und natürlich können Sie im Allgemeinen nicht verwendentime()
dann. Portabel müsstest du verwendentimespec_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
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.
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