2017-11-28 10 views
0

mit Kann jemand bitte vorschlagen, wie kann ich Linux-Zeit mitAbrufen von Linux Zeit struct timespec

struct timespec ts

Typ abrufen? Es gibt mir nur Zeit seit Epoch. Kann ich mit diesem Datentyp die tatsächliche Linux-Zeit abrufen?

Kurzer Hintergrund: Ich schreibe ein Logger-Dienstprogramm auf Embedded-Gerät mit Zeitstempel Auflösung in Millisekunden/Mikrosekunden. Die Quelle fügt einen Zeitstempel hinzu, der von der Zielkomponente verbraucht wird.

struct stLogItem logitem; //stLogItem has a member, struct timespec ts  
clock_gettime(clk_id, &logitem.ts); 

Die Zielkomponente druckt diesen Protokollzeitstempel in Datei/Konsole. Aber das Datum, das ausgedruckt wird, ist Zeit seit Epoch und nicht das eigentliche Linux-Datum.

Die gedruckte Daten: 1970-01-01 23: 30: 07,586864475

Während das Linux Datum verschieden ist, wie unten gezeigt:

root @ IMH: # Datum

Di 14. November 11.34.12 UTC 2017

Es ist kein Formatproblem. Es geht darum, die aktuelle Linux-Zeit (in Nanosekunden) zu erhalten.

+2

Was ist "tatsächliche Linux-Zeit"? Zeit seit der ersten Ankündigung von Linus? :) – unwind

+0

Sie können sich gerne 'localtime *()' anschauen. – alk

+0

Tue Nov 14 10:06:34 UTC 2017 (nach der Eingabe von "Datum" auf Shell) – Irfan

Antwort

3

Was Sie tun hält:

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

int main(void) 
{ 
    struct timespec ts;  
    clock_gettime(CLOCK_REALTIME, &ts); 

    char * p = ctime(&ts.tv_sec); /* Note that ctime() isn't thread-safe. */ 
    p[strcspn(p, "\r\n")] = 0; 

    printf("Date: %s %ldns\n", p, ts.tv_nsec); 

    ... 
} 

Von the relevant documentation:

Alle Implementierungen unterstützen die systemweite Echtzeit-Uhr, die von CLOCK_REALTIME identifiziert wird. Seine Zeit repräsentiert Sekunden und Nanosekunden seit der Epoche.

(POSIX documentation is here.)

+0

dies druckt nur die Ausgabe "Do Jan 1 23:28:20 1970 690758173ns " wo als Ergebnis des "date" -Befehl gibt Ausgabe "Tue Nov 14 10:59:57 UTC 2017". Sie können sehen, zwei Daten haben unterschiedliche Zeitwerte (einfach über Format vergessen) – Irfan

+0

Und das ist aufgrund der Tatsache, dass ts Variable diese Zeit hat. ctime gibt nur die Eingabezeit als String zurück – Irfan

+0

@Irfan: Wenn der obige Code wirklich "* Do Jan 1 23:28:20 1970 ... *" gibt, scheint es, dass Ihre Systemuhr durcheinander ist und zur falschen Zeit läuft. – alk

3

Nach dem Aufruf clock_gettime, ts.tv_sec, die time_t hat geben kann, da die Zeit mit dem Zeitstempel in Sekunden aufgefüllt. Sie können das direkt an localtime passieren:

struct timespec ts;  
clock_gettime(clk_id, &ts); 
struct tm *my_tm = localtime(&ts.tv_sec); 

Jetzt my_tm verweist auf eine struct tm, die die Zeit bis in Jahr/Monat/Tag/Stunde/Minute/Sekunde gebrochen hat, und ts.tv_nsec hat den Nanosekunde Teil.

+0

Beachten Sie, dass die 'tm_year'- und' tm_mon'-Felder der Aufschlüsselungszeit oddball-Kodierungen haben, und 'strftime()' kann zur Formatierung von Zeitstrings verwendet werden (aber Nanosekunden müssen separat und sorgfältig behandelt werden). –

Verwandte Themen