Qual è il metodo migliore per stampare l'ora in C nel formato 2009‐08‐10
18:17:54.811
?
Qual è il metodo migliore per stampare l'ora in C nel formato 2009‐08‐10
18:17:54.811
?
Risposte:
Usa strftime () .
#include <stdio.h>
#include <time.h>
int main()
{
time_t timer;
char buffer[26];
struct tm* tm_info;
timer = time(NULL);
tm_info = localtime(&timer);
strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
puts(buffer);
return 0;
}
Per parte millisecondi, dai un'occhiata a questa domanda. Come misurare il tempo in millisecondi utilizzando ANSI C?
time(&timer)
dovrebbe essere piuttosto timer = time(NULL);
, almeno per Linux. The tloc argument is obsolescent and should always be NULL in new code. When tloc is NULL, the call cannot fail.
Le risposte di cui sopra non rispondono completamente alla domanda (in particolare la parte millisec). La mia soluzione è usare gettimeofday prima di strftime. Notare la cura per evitare di arrotondare millisec a "1000". Questo si basa 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;
}
gettimeofday
non è disponibile su implementazioni Windows
time.h
definisce una strftime
funzione che può darti 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 questo non ti darà una risoluzione inferiore al secondo poiché non è disponibile da un file time_t
. Emette:
2010-09-09 10:08:34.000
Se sei davvero vincolato dalle specifiche e non desideri lo spazio tra il giorno e l'ora, rimuovilo dalla stringa di formato.
Il codice seguente viene stampato con una precisione al microsecondo. Tutto quello che dobbiamo fare è usare gettimeofday
and strftime
on 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;
}
Potresti usare 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);
trucco:
int time_len = 0, n;
struct tm *tm_info;
struct timeval tv;
gettimeofday(&tv, NULL);
tm_info = localtime(&tv.tv_sec);
time_len+=strftime(log_buff, sizeof log_buff, "%y%m%d %H:%M:%S", tm_info);
time_len+=snprintf(log_buff+time_len,sizeof log_buff-time_len,".%03ld ",tv.tv_usec/1000);
Nessuna delle soluzioni in questa pagina ha funzionato per me, le ho mescolate e le ho fatte funzionare con Windows e Visual Studio 2019, ecco come:
#include <Windows.h>
#include <time.h>
#include <chrono>
static int gettimeofday(struct timeval* tp, struct timezone* tzp) {
namespace sc = std::chrono;
sc::system_clock::duration d = sc::system_clock::now().time_since_epoch();
sc::seconds s = sc::duration_cast<sc::seconds>(d);
tp->tv_sec = s.count();
tp->tv_usec = sc::duration_cast<sc::microseconds>(d - s).count();
return 0;
}
static char* getFormattedTime() {
static char buffer[26];
// For Miliseconds
int millisec;
struct tm* tm_info;
struct timeval tv;
// For Time
time_t rawtime;
struct tm* timeinfo;
gettimeofday(&tv, NULL);
millisec = lrint(tv.tv_usec / 1000.0);
if (millisec >= 1000)
{
millisec -= 1000;
tv.tv_sec++;
}
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", timeinfo);
sprintf_s(buffer, 26, "%s.%03d", buffer, millisec);
return buffer;
}
Risultato:
2020: 08: 02 06: 41: 59.107
2020: 08: 02 06: 41: 59.196