36 #include <drizzled/type/time.h>
37 #include <drizzled/util/gmtime.h>
44 #define SECS_DAY (24L * 60L * 60L)
45 #define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
46 #define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)
47 #define FIRSTSUNDAY(timp) (((timp)->tm_yday - (timp)->tm_wday + 420) % 7)
48 #define FIRSTDAYOF(timp) (((timp)->tm_wday - (timp)->tm_yday + 420) % 7)
50 #define TIME_MAX INT64_MIN
52 const int _ytab[2][12] =
54 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
55 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
58 struct tm *gmtime(
const type::epoch_t &timer,
struct tm *tmbuf)
60 uint64_t dayclock, dayno;
66 dayclock = (uint64_t) timer % SECS_DAY;
67 dayno = (uint64_t) timer / SECS_DAY;
69 tmbuf->tm_sec = dayclock % 60;
70 tmbuf->tm_min = (dayclock % 3600) / 60;
71 tmbuf->tm_hour = dayclock / 3600;
72 tmbuf->tm_wday = (dayno + 4) % 7;
73 while (dayno >= (uint64_t) YEARSIZE(year))
75 dayno -= YEARSIZE(year);
78 tmbuf->tm_year = year - YEAR0;
79 tmbuf->tm_yday = dayno;
81 while (dayno >= (uint64_t) _ytab[LEAPYEAR(year)][tmbuf->tm_mon])
83 dayno -= _ytab[LEAPYEAR(year)][tmbuf->tm_mon];
86 tmbuf->tm_mday = dayno + 1;
92 void gmtime(
const type::epoch_t &timer, type::Time &tmbuf)
94 uint64_t dayclock, dayno;
95 int32_t year= EPOCH_YR;
102 dayclock= (uint64_t) timer % SECS_DAY;
103 dayno= (uint64_t) timer / SECS_DAY;
105 tmbuf.second= dayclock % 60;
106 tmbuf.minute= (dayclock % 3600) / 60;
107 tmbuf.hour= dayclock / 3600;
108 while (dayno >= (uint64_t) YEARSIZE(year))
110 dayno -= YEARSIZE(year);
114 while (dayno >= (uint64_t) _ytab[LEAPYEAR(year)][tmbuf.month])
116 dayno -= _ytab[LEAPYEAR(year)][tmbuf.month];
121 tmbuf.time_type= type::DRIZZLE_TIMESTAMP_DATETIME;