2010-09-09 4 views

risposta

82

Utilizzare strftime().

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

int main() 
{ 
    time_t timer; 
    char buffer[26]; 
    struct tm* tm_info; 

    time(&timer); 
    tm_info = localtime(&timer); 

    strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info); 
    puts(buffer); 

    return 0; 
} 

Per la parte in millisecondi, dare un'occhiata a questa domanda. How to measure time in milliseconds using ANSI C?

+0

È una risposta ancora migliore ora, e oggetti di scena per cercare come gestire la parte in millisecondo. Penso che il tuo buffer sia ora un po 'più lungo di quello che deve essere, però. –

+11

Meglio essere più lunghi di quelli più corti :-) – paxdiablo

+0

Risposta superba. Potrei fare qualsiasi cosa in PHP, ma sapevo che era tutto già presente in C. THanks. –

2

È possibile utilizzare strftime, ma struct tm non ha risoluzione per parti di secondi. Non sono sicuro che sia assolutamente necessario per i tuoi scopi.

struct tm tm; 
/* Set tm to the correct time */ 
char s[20]; /* strlen("2009-08-10 18:17:54") + 1 */ 
strftime(s, 20, "%F %H:%M:%S", &tm); 
+2

Digitazione: '% s' =>'% S' –

+0

Grazie a @HugoIdeler. Fisso. –

4

time.h definisce una funzione strftime che può dare una rappresentazione testuale di un time_t usando qualcosa come:

#include <stdio.h> 
#include <time.h> 
int main (void) { 
    char buff[100]; 
    time_t now = time (0); 
    strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now)); 
    printf ("%s\n", buff); 
    return 0; 
} 

ma che non ti darà risoluzione sub-secondi dal momento che non è disponibile da un time_t. Produce:

2010-09-09 10:08:34.000 

Se sei veramente vincolati dalle specifiche e non si desidera lo spazio tra il giorno e l'ora, basta rimuoverlo dalla stringa di formato.

+0

+1 per il trucco espediente per la compilazione del display al millisecondo. Una volta ho avuto un cliente che voleva che lo facessi, ma con cifre non pari a zero, quindi sembrava che ci fosse un significato. Ne ho parlato fuori ma ho accettato di mettere zero. – RBerteig

+3

Un mio amico (non io ovviamente) una volta usava un trucco simile: tenevano le statiche contenenti l'ultimo secondo e "millisecondo".Dove il secondo non è cambiato dall'ultima volta, hanno appena aggiunto un valore casuale compreso tra 1 e 200 a millisec (assicurandosi che non sia passato oltre 999 ovviamente - il massimo effettivo per il rand() è sempre stato il minimo di 200 e metà della distanza a 999). Dove il secondo è cambiato, ha appena impostato millisec a 0 prima dell'aggiunta. Nizza apparentemente casuale ma correttamente sequenziato in millisecondi e il cliente non ne è stato più saggio :-) – paxdiablo

16

Le risposte di cui sopra non rispondono completamente alla domanda (in particolare la parte del millisecondo). La mia soluzione a questo è di usare gettimeofday prima di strftime. Prestare attenzione a evitare l'arrotondamento millisec a "1000". Questo è basato sulla risposta di Hamid Nazari.

#include <stdio.h> 
#include <sys/time.h> 
#include <time.h> 
#include <math.h> 

int main() { 
    char buffer[26]; 
    int millisec; 
    struct tm* tm_info; 
    struct timeval tv; 

    gettimeofday(&tv, NULL); 

    millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec 
    if (millisec>=1000) { // Allow for rounding up to nearest second 
    millisec -=1000; 
    tv.tv_sec++; 
    } 

    tm_info = localtime(&tv.tv_sec); 

    strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", tm_info); 
    printf("%s.%03d\n", buffer, millisec); 

    return 0; 
} 
+0

'gettimeofday' non è disponibile sulle implementazioni di Windows – Mendes

+0

Aggiungi le opzioni '-lm' quando lo costruisci. – skysign

+1

Penso che il buffer [24] sia sufficiente, la ragione è come sotto, YYYY: MM: DD HH: MM: SS.mmm + '\ 0', è 24. – skysign

2

Il codice seguente stampa con precisione in microsecondi. Tutto quello che dobbiamo fare è usare gettimeofday e strftime su tv_sec e aggiungere tv_usec alla stringa costruita.

#include <stdio.h> 
#include <time.h> 
#include <sys/time.h> 
int main(void) { 
    struct timeval tmnow; 
    struct tm *tm; 
    char buf[30], usec_buf[6]; 
    gettimeofday(&tmnow, NULL); 
    tm = localtime(&tmnow.tv_sec); 
    strftime(buf,30,"%Y:%m:%dT%H:%M:%S", tm); 
    strcat(buf,"."); 
    sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec); 
    strcat(buf,usec_buf); 
    printf("%s",buf); 
    return 0; 
} 
Problemi correlati