2012-11-24 7 views
7

ich für Übergabe an java Schicht st_mtime zu String-Format konvertieren müssen (die von Stat-Funktion erhalten) zu konvertieren, ich versuche, dieses Beispiel Fehler http://www.cplusplus.com/forum/unices/10342/ aber Compiler produzierenWie st_mtime bespannen oder char

zu verwenden invalid Umwandlung von 'long unsigned int *' zu 'const time_t * {aka long int const *}'

Initialisieren Argument 1 von 'TM * Localtime (const time_t *)' [-fpermissive]

Was ich falsch mache, wie man mit der Stat-Funktion in der String-Darstellung die Zeit der Dateierstellung bekommt.

Hilfe bitte.

+0

Zeigen Sie einen SSCCE Ihres ** tatsächlichen ** Codes. –

Antwort

11

Nach der stat(2) Manpage, das st_mtime Feld ist ein time_t (dh nach Lesen der time(7) man-Seite, eine Anzahl von Sekunden seit der unix Epoch).

Sie müssen localtime(3) konvertieren, dass time_t auf eine struct tm in Ortszeit, dann strftime(3) es zu einer char* Zeichenfolge zu konvertieren.

So könnte Code, den Sie so etwas wie:

time_t t = mystat.st_mtime; 
struct tm lt; 
localtime_r(&t, &lt); 
char timbuf[80]; 
strftime(timbuf, sizeof(timbuf), "%c", &lt); 

dann timbuf vielleicht verwenden, indem strdup es -Ing.

NB. Ich verwende localtime_r, weil es fadenfreundlicher ist.

+0

Wenn Sie das Format nicht pingelig finden, können Sie time_t auch einfach an "ctime" übergeben, um eine Zeichenfolge zu erhalten. (Hinweis: ctime ist nicht Thread-sicher.) – fadden

+0

Aber das OP benötigt eine Thread-sichere Lösung, weil es in einer JVM ist. –

8

Verwendung strftime() gibt es ein Beispiel in der man page so etwas wie:

struct tm *tm; 
char buf[200]; 
/* convert time_t to broken-down time representation */ 
tm = localtime(&t); 
/* format time days.month.year hour:minute:seconds */ 
strftime(buf, sizeof(buf), "%d.%m.%Y %H:%M:%S", tm); 
printf("%s\n", buf); 

die Ausgabe drucken würde:

"24.11.2012 17:04:33" 
+0

Woher hast du 't'? –

1

du in einer alternativen Art und Weise erreichen:

  1. einen Zeiger auf eine tm Struktur deklarieren:

    struct tm *tm; 
    
  2. ein Zeichenfeld geeigneter Größe erklären, die den Zeit-String enthalten können Sie wollen:

    char file_modified_time[100]; 
    
  3. Break the st.st_mtime (wo st ist ein struct vom Typ stat, das heißt struct stat st) in eine lokale Zeit mit der Funktion localtime():

    tm = localtime(&st.st_mtim); 
    

    Hinweis: st_mtime ist ein Makro (#define st_mtime st_mtim.tv_sec) in der Manpage von stat(2).

    sprintf(file_modified_time, "%d_%d.%d.%d_%d:%d:%d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); 
    

NB:

  • sprintf() Verwenden Sie die gewünschte Zeit im String-Format oder was auch immer das Format, das Sie möchten, erhalten Sie sollten

    memset(file_modified_time, '\0', strlen(file_modified_time)); 
    

    vor sprintf() verwenden zu vermeiden die Gefahr von Müll, der beim Multithreading entsteht.