您能告诉我如何将一个struct timeval实例格式化为人类可读的格式,如"2010-01-01 15:35:10.0001"?
发布于 2010-03-09 20:39:10
使用localtime和strftime转换tv_sec,然后追加tv_usec部件。
发布于 2010-03-09 20:45:51
您需要手动附加微秒部分,因为它不在strftime()处理的struct tm中。下面是一段代码:
struct timeval tv;
time_t nowtime;
struct tm *nowtm;
char tmbuf[64], buf[64];
gettimeofday(&tv, NULL);
nowtime = tv.tv_sec;
nowtm = localtime(&nowtime);
strftime(tmbuf, sizeof tmbuf, "%Y-%m-%d %H:%M:%S", nowtm);
snprintf(buf, sizeof buf, "%s.%06ld", tmbuf, tv.tv_usec);请注意,我们如何使用06的显式精度来获取填充为零的微秒字段。由于微秒从0到999,999,999,因此必须始终填充为6位数字。我们不想把57微秒误认为570,000 (比较"1.57“和"1.000057")。
发布于 2015-05-09 12:28:33
结合前面的答案和注释,将格式更改为RFC3339-compliant,并检查所有错误条件,您将得到以下结果:
#include <stdio.h>
#include <sys/time.h>
ssize_t format_timeval(struct timeval *tv, char *buf, size_t sz)
{
ssize_t written = -1;
struct tm *gm = gmtime(&tv->tv_sec);
if (gm)
{
written = (ssize_t)strftime(buf, sz, "%Y-%m-%dT%H:%M:%S", gm);
if ((written > 0) && ((size_t)written < sz))
{
int w = snprintf(buf+written, sz-(size_t)written, ".%06dZ", tv->tv_usec);
written = (w > 0) ? written + w : -1;
}
}
return written;
}
int main() {
struct timeval tv;
char buf[28];
if (gettimeofday(&tv, NULL) != 0) {
perror("gettimeofday");
return 1;
}
if (format_timeval(&tv, buf, sizeof(buf)) > 0) {
printf("%s\n", buf);
// sample output:
// 2015-05-09T04:18:42.514551Z
}
return 0;
}https://stackoverflow.com/questions/2408976
复制相似问题