如何以格式打印时间: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
上使用gettimeofday
和strftime
,并将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; }