wymyśliłem to:
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);
}
poprawki dla problemów trzeba było:
- Korzystając
gettimeofday()
i struct timeval
, który posiada człon mikrosekund dla większej precyzji.
- Użyj podejścia dwuetapowego, w którym najpierw budujemy ciąg zawierający wszystkie dane oprócz mikrosekund.
- Użyj małej litery "z" do przesunięcia strefy czasowej. To wydaje się być rozszerzeniem GNU.
Próbowałem ponownego tworzenia strefy czasowej ręcznie, przez drugi struct timezone *
argument gettimeofday()
, ale na moim komputerze zwraca przesunięcie 0, co nie jest poprawne. manual page dla gettimefday()
ma wiele do powiedzenia na temat obsługi stref czasowych pod Linuksem (na którym testowałem system operacyjny).
'% z' jest nadal niestandardowy =) – gnud
Dzięki, jest to najbliżej, jak do tej pory. "%% 06u" właśnie wyrzuca mi teraz dane ze śmieci, ale reszta działa dobrze. P.S Tak, wiem, że% z jest niestandardowy, ale wezmę go :) –
@aditya: To dziwne ... Powyższy kod powinien zadziałać. Upewnij się, że podajesz drugie wywołanie funkcji snprintf() z odpowiednią niepodpisaną wartością mikrosekund do użycia dla formatu% 06u. Możesz spróbować wydrukować wynik po wywołaniu strftime(), powinieneś zobaczyć końcowe wyjście z wyjątkiem sekwencji% 06u po okresie. – unwind