1#pragma once
2
3//http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/430449b3-f6dd-4e18-84de-eebd26a8d668
4
5#include <time.h>
6#include <winsock2.h>
7
8#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
9  #define DELTA_EPOCH_IN_MICROSECS  11644473600000000Ui64
10#else
11  #define DELTA_EPOCH_IN_MICROSECS  11644473600000000ULL
12#endif
13
14struct timespec {
15
16time_t tv_sec; /* Seconds since 00:00:00 GMT, */
17
18/* 1 January 1970 */
19
20long tv_nsec; /* Additional nanoseconds since */
21
22/* tv_sec */
23
24};
25
26struct timezone
27{
28  int  tz_minuteswest; /* minutes W of Greenwich */
29  int  tz_dsttime;     /* type of dst correction */
30};
31
32static __inline int gettimeofday(struct timeval *tv, struct timezone *tz)
33{
34  FILETIME ft;
35  unsigned __int64 tmpres = 0;
36  static int tzflag;
37
38  if (NULL != tv)
39  {
40    GetSystemTimeAsFileTime(&ft);
41
42    tmpres |= ft.dwHighDateTime;
43    tmpres <<= 32;
44    tmpres |= ft.dwLowDateTime;
45
46    /*converting file time to unix epoch*/
47    tmpres -= DELTA_EPOCH_IN_MICROSECS;
48    tv->tv_sec = (long)(tmpres / 1000000UL);
49    tv->tv_usec = (long)(tmpres % 1000000UL);
50  }
51
52  if (NULL != tz)
53  {
54    if (!tzflag)
55    {
56      _tzset();
57      tzflag++;
58    }
59    tz->tz_minuteswest = _timezone / 60;
60    tz->tz_dsttime = _daylight;
61  }
62
63  return 0;
64}