2009-10-11 13 views

Odpowiedz

21

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).

+1

'% z' jest nadal niestandardowy =) – gnud

+0

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 :) –

+0

@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

1

"%Y-%m-%d %T %z", ale wydaje się, że %z jest rozszerzeniem GNU.

+3

% T nie podaje podseksułów wskazanych w pytaniu. – unwind

Powiązane problemy