有没有办法在不使用任何数组的情况下,将来自gettimeofday()的时间刻度数和格式存储为某种特定方式(例如"%m-%d-%Y%T")?
这将为计算当前时间的程序的每个实例节省内存。
使用数组的相同代码。(取自C - gettimeofday for computing time?)
char buffer[30];
struct timeval tv;
time_t curtime;
gettimeofday(&tv, NULL);
curtime=tv.tv_sec;
strftime(buffer,30,"%m-%d-%Y %T.",localtime(&curtime));
printf("%s%ld\n",buffer,tv.tv_usec);
答案 0 :(得分:0)
任何存储号码的方法......来自gettimeofday()和......而不使用任何数组?
gettimeofday()
不会返回"时间刻度数"。这是一个*nix
函数,用于填充struct timeval
,其中包含time_t
和long
,表示以秒和微秒为单位的当前时间。使用clock()
获取"时间刻度数"。
避免数组的最简单方法是将结果保留在struct timeval
中而不做任何修改。
这将为计算当前时间的程序的每个实例节省内存。
这听起来像OP希望尽可能地节省内存。代码可以将struct timeval
转换为int64_t
(自纪元以来的微秒数),而不会有太大的范围丢失风险。如果sizeof(struct timeval) > sizeof(int64_t)
,这只会节省内存。
#include <sys/time.h>
int64_t timeval_to_int64(const struct timeval *tv) {
const int32_t us_per_s = 1000000;
int64_t t = tv->tv_sec;
if (t >= INT64_MAX / us_per_s
&& (t > INT64_MAX / us_per_s || tv->tv_usec > INT64_MAX % us_per_s)) {
// Handle overflow
return INT64_MAX;
}
if (t <= INT64_MIN / us_per_s
&& (t < INT64_MIN / us_per_s || tv->tv_usec < INT64_MIN % us_per_s)) {
// Handle underflow
return INT64_MIN;
}
return t * us_per_s + tv->tv_usec;
}
void int64_to_timeval(struct timeval *tv, int64_t t) {
const int32_t us_per_s = 1000000;
tv->tv_sec = t / us_per_s;
tv->tv_usec = t % us_per_s;
if (tv->tv_usec < 0) { // insure tv_usec member is positive.
tv->tv_usec += us_per_s;
tv->tv_sec++;
}
}
如果代码想要将时间戳保存为文件 text ,并且空间最小,则可以选择多种选项。 What is the most efficient binary to text encoding? 讨论了一些想法。对于OP的代码,虽然2个成员的十进制或十六进制打印可能就足够了。
printf("%lld.%06ld\n", (long long) tv.tv_sec, tv.tv_usec);
我不建议通过localtime()
存储时间戳,因为这会产生时区和日光节省时间的模糊或开销。如果代码必须使用月,日,年保存,请考虑ISO 8601并使用通用时间。
#include <sys/time.h>
int print_timeval_to_ISO8601(const struct timeval *tv) {
struct tm t = *gmtime(&tv->tv_sec);
return printf("%04d-%02d-%02dT%02d:%02d:%02d.%06ld\n", //
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, //
t.tm_hour, t.tm_min, t.tm_sec, tv->tv_usec);
// Or ("%04d%02d%02d%02d%02d%02d.%06ld\n"
}
注意OP的代码有一个缺点。当出现".12"
时,像12这样的微秒值会打印".000012"
。
// printf("%s%ld\n",buffer,tv.tv_usec);
printf("%s%06ld\n",buffer,tv.tv_usec);