gettimeofday用于显示当前时间而不使用空格

时间:2018-01-02 06:19:04

标签: c

有没有办法在不使用任何数组的情况下,将来自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);

1 个答案:

答案 0 :(得分:0)

  

任何存储号码的方法......来自gettimeofday()和......而不使用任何数组?

gettimeofday()不会返回"时间刻度数"。这是一个*nix函数,用于填充struct timeval,其中包含time_tlong,表示以秒和微秒为单位的当前时间。使用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);