获取包含微秒的日期和时间的时间戳

时间:2016-07-19 12:20:16

标签: c windows time

对于错误日志,我想创建一个包含日期和时间的时间戳,包括微秒。它的格式应为2016.07.19 13:59:31:123.456

我找到了很多time_t的例子,但分辨率只有几秒......

1 个答案:

答案 0 :(得分:1)

您可以使用gettimeofday

#include <time.h>
#include <sys/time.h>
....
struct timeval tv;
gettimeofday(&tv, NULL);

struct timeval定义为:

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

然后,您可以使用gmtime拆分秒部分:

struct tm *ts = gmtime(&tv.tv_sec);

struct tm定义为:

          struct tm {
              int tm_sec;         /* seconds */
              int tm_min;         /* minutes */
              int tm_hour;        /* hours */
              int tm_mday;        /* day of the month */
              int tm_mon;         /* month */
              int tm_year;        /* year */
              int tm_wday;        /* day of the week */
              int tm_yday;        /* day in the year */
              int tm_isdst;       /* daylight saving time */
          };
     

tm结构的成员是:

     
      
  • tm_sec分钟后的秒数,通常在0范围内             至59,但可以达到60,以允许闰秒。

  •   
  • tm_min小时后的分钟数,范围为0到59.

  •   
  • tm_hour             午夜过后的小时数,范围为0到23。

  •   
  • tm_mday             每月的日期,范围为1到31。

  •   
  • tm_mon自1月以来的月数,范围为0到11。

  •   
  • tm_year             自1900年以来的年数。

  •   
  • tm_wday             自星期日以来的天数,范围为0到6。

  •   
  • tm_yday             自1月1日以来的天数,范围为0到365.

  •   
  • tm_isdst的             一个标志,指示夏令时是否有效             在描述的时间。如果夏令时,该值为正             时间有效,如果不是,则为零,如果信息为             mation不可用。

  •   

编辑:

Windows没有gettimeofday。这是您可以使用的实现:

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
    const unsigned __int64 epoch_diff = 11644473600000000;
    unsigned __int64 tmp;
    FILETIME t;

    if (tv) {
        GetSystemTimeAsFileTime(&t);

        tmp = 0;
        tmp |= t.dwHighDateTime;
        tmp <<= 32;
        tmp |= t.dwLowDateTime;

        tmp /= 10;
        tmp -= epoch_diff;
        tv->tv_sec = (long)(tmp / 1000000);
        tv->tv_usec = (long)(tmp % 1000000);
    }

    return 0;
}