如何以格式打印时间:2009-08-10 18:17:54.811

2009‐08‐10 18:17:54.811格式打印C文件的最佳方法是什么?

使用strftime() 。

 #include <stdio.h> #include <time.h> int main() { time_t timer; char buffer[26]; struct tm* tm_info; time(&timer); tm_info = localtime(&timer); strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info); puts(buffer); return 0; } 

对于毫秒部分,看看这个问题。 如何用毫秒测量时间使用ANSI C?

上面的答案没有完全回答这个问题(特别是millisec部分)。 我的解决scheme是在strftime之前使用gettimeofday。 注意避免将millisec舍入到“1000”。 这是基于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; } 

time.h定义了一个strftime函数,它可以给你一个time_t的文本表示,像这样:

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

但这不会给你亚秒的决议,因为这是从一个time_t不可用。 它输出:

 2010-09-09 10:08:34.000 

如果你真的受到规范的约束,不希望在一天和一小时之间的空间,只是从格式string中删除它。

你可以使用strftime ,但是struct tm没有秒的部分分辨率。 我不确定这是绝对需要为您的目的。

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

以下代码以微秒精度打印。 我们所要做的就是在tv_sec上使用gettimeofdaystrftime ,并将tv_usec附加到构造的string中。

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