2009-10-11 3 views
7

Qui è il tipo di tempo di formattazione che sto cercando:Utilizzando strftime in C, come posso formattare il tempo esattamente come un timestamp Unix?

2009-10-08 04:31:33.918700000 -0500 

Attualmente sto usando questo:

strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", ts); 

che dà:

2009-10-11 13:42:57 CDT 

che è vicino, ma non esatto. Non riesco a trovare nulla sulla visualizzazione di -0500 alla fine. Inoltre sto prendendo i secondi come un int.

Come posso risolvere questi due problemi?

risposta

21

sono arrivato fino a questo:

char   fmt[64], buf[64]; 
    struct timeval tv; 
    struct tm  *tm; 

    gettimeofday(&tv, NULL); 
    if((tm = localtime(&tv.tv_sec)) != NULL) 
    { 
      strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u %z", tm); 
      snprintf(buf, sizeof buf, fmt, tv.tv_usec); 
      printf("'%s'\n", buf); 
    } 

correzioni per i problemi che hai avuto:

  • Usa gettimeofday() e struct timeval, che ha un membro microsecondi per la precisione più elevata.
  • Utilizzare un approccio in due fasi, in cui per prima cosa costruiamo una stringa contenente tutti i dati tranne i microsecondi.
  • Utilizzare la lettera minuscola 'z' per lo sfasamento del fuso orario. Questa sembra essere un'estensione GNU.

Ho provato ricreare l'offset manualmente, tramite il secondo argomento della struct timezone *gettimeofday() fuso orario, ma sulla mia macchina che restituisce un offset di 0 che non è corretto. Lo manual page per gettimefday() ha molto da dire sulla gestione dei fusi orari sotto Linux (che è il sistema operativo su cui ho provato).

+1

'% z' è ancora non standard =) – gnud

+0

Grazie, questo è il più vicino che ho ottenuto finora. Il '%% 06u' mi sta restituendo dei dati inutili, ma il resto funziona bene. P.S Sì, so che% z non è standard, ma lo prendo :) –

+0

@aditya: È strano ... Il codice sopra dovrebbe funzionare. Assicurati di fornire la seconda chiamata snprintf() con un valore di microsecondi senza segno appropriato da utilizzare per il formato% 06u. Puoi provare a stampare il risultato dopo la chiamata strftime(), dovresti vedere il tuo output finale tranne la sequenza% 06u dopo il punto. – unwind

1

"%Y-%m-%d %T %z", ma sembra che %z sia un'estensione GNU.

+3

% T non fornisce le cifre secondarie secondarie richieste nella domanda. – unwind