2012-11-24 13 views
7

ho bisogno di convertire st_mtime in formato stringa per passarlo a livello java, cerco di utilizzare questo esempio http://www.cplusplus.com/forum/unices/10342/ ma producono compilatore erroriCome convertire st_mtime (che ottiene dalla funzione stat) per stringa o char

la conversione non valida da 'unsigned long int *' a 'const time_t * {alias long int const *}'

inizializzazione argomento 1 di 'tm * localtime (const time_t *)' [-fpermissive]

Cosa faccio male, come ottenere la creazione del tempo del file usando la funzione stat nella presentazione di stringhe.

Guida per favore.

+0

Mostra un codice SSCCE ** effettivo **. –

risposta

11

Secondo la pagina stat(2) uomo, il campo st_mtime è una time_t (cioè dopo leggendo la pagina man time(7), un numero di secondi dal unix Epoch).

È necessario convertire localtime(3) che time_t ad un struct tm in ora locale, poi, strftime(3) per convertirlo in una stringa char*.

Così si potrebbe codice qualcosa di simile:

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

quindi utilizzare timbuf magari strdup -ing esso.

NB. Sto usando localtime_r perché è più thread-friendly.

+0

Se non sei esigente riguardo al formato, puoi anche solo passare time_t in "ctime" per ottenere una stringa. (Nota ctime non è thread-safe.) – fadden

+0

Ma l'OP ha bisogno di una soluzione thread-safe, perché è all'interno di una JVM. –

8

uso strftime() c'è un esempio nella man page qualcosa come:

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

Sarebbe stampare l'output:

"24.11.2012 17:04:33" 
+0

Dove hai preso 't'? –

1

È possibile raggiungere questo obiettivo in modo alternativo:

  1. dichiarare un puntatore ad una struttura tm:

    struct tm *tm; 
    
  2. dichiarare un array di caratteri di dimensioni appropriate, in grado di contenere la stringa di tempo vuoi:

    char file_modified_time[100]; 
    
  3. Rompere il st.st_mtime (dove st è una struct di tipo stat, vale a dire struct stat st) in un ora locale utilizzando la funzione localtime():

    tm = localtime(&st.st_mtim); 
    

    Nota: st_mtime è una macro (#define st_mtime st_mtim.tv_sec) nella pagina man di stat(2).

  4. Usa sprintf() per ottenere il tempo desiderato in formato stringa o qualunque sia il formato desiderato:

    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: Si consiglia di utilizzare

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

prima sprintf() per evitare il rischio di qualsiasi immondizia che si presenta nel multi-threading.

Problemi correlati