Jaka jest najlepsza metoda drukowania czasu w C w formacie 2009‐08‐10
18:17:54.811
?
97
Użyj 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;
}
Przez część milisekund spójrz na to pytanie. Jak mierzyć czas w milisekundach za pomocą ANSI C?
time(&timer)
powinna raczej byćtimer = time(NULL);
, przynajmniej dla Linuksa.The tloc argument is obsolescent and should always be NULL in new code. When tloc is NULL, the call cannot fail.
Powyższe odpowiedzi nie odpowiadają w pełni na pytanie (konkretnie część milisekowa). Moim rozwiązaniem jest użycie gettimeofday przed strftime. Zwróć uwagę, aby uniknąć zaokrąglania milisek do „1000”. Jest to oparte na odpowiedzi Hamida Nazariego.
#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; }
źródło
gettimeofday
nie jest dostępne w implementacjach systemu Windowstime.h
definiujestrftime
funkcję, która może dać tekstową reprezentacjętime_t
użycia czegoś takiego jak:#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; }
ale to nie zapewni rozdzielczości poniżej sekundy, ponieważ nie jest dostępna z pliku
time_t
. Wyprowadza:2010-09-09 10:08:34.000
Jeśli naprawdę jesteś ograniczony specyfikacjami i nie chcesz odstępu między dniem a godziną, po prostu usuń go z ciągu formatu.
źródło
Poniższy kod jest drukowany z dokładnością do mikrosekund. Wszystko co musimy zrobić, to użyć
gettimeofday
istrftime
natv_sec
i dołączyćtv_usec
do skonstruowanego łańcucha.#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; }
źródło
Możesz użyć
strftime
, alestruct tm
nie ma rozdzielczości dla części sekund. Nie jestem pewien, czy jest to absolutnie wymagane do twoich celów.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);
źródło
sztuczka:
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);
źródło
Żadne z rozwiązań na tej stronie nie działało dla mnie, pomieszałem je i sprawiłem, że działały z Windows i Visual Studio 2019, oto jak:
#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; }
Wynik:
źródło