2009-10-11 25 views

回答

21

我想出了這個:你有問題

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); 
    } 

修正:

  • 使用gettimeofday()struct timeval,這對於較高的精度微秒成員。
  • 使用兩步法,首先構建一個包含除微秒之外的所有數據的字符串。
  • 使用小寫'z'作爲時區偏移量。這似乎是一個GNU擴展。

我試圖重新創建時區偏移手動,通過gettimeofday()第二struct timezone *參數,但我的機器上返回的0這是不正確的偏移量。 manual page對於gettimefday()有很多關於在Linux下處理時區(這是我測試的操作系統)的說法。

+1

'%z'仍然是非標準的=) – gnud 2009-10-11 20:18:40

+0

謝謝,這是迄今爲止我得到的最接近的。 '%% 06u'現在只是向我扔垃圾數據,但其餘的效果很好。 P.S是的,我知道,%z是非標準的,但我會接受它:) – 2009-10-11 20:40:26

+0

@aditya:這是奇怪...上面的代碼應該工作。確保提供第二個snprintf()調用時使用正確的無符號微秒值,以用於%06u格式。您可以嘗試在strftime()調用後打印結果,除了時間段之後的%06u序列,您應該會看到最終的輸出。 – unwind 2009-10-11 20:55:13

1

"%Y-%m-%d %T %z",但它似乎%z是一個GNU擴展。

+3

%T不提供問題中要求的亞秒數。 – unwind 2009-10-11 20:22:23

相關問題