Permalink
Browse files

do right timezones right

  • Loading branch information...
1 parent 82f6907 commit e4faf74a76768438dc32854e5cc19290d71a222d @mind04 mind04 committed with Habbie Aug 14, 2013
Showing with 28 additions and 2 deletions.
  1. +1 −1 pdns/rcpgenerator.cc
  2. +25 −0 pdns/unix_utility.cc
  3. +2 −1 pdns/utility.hh
@@ -451,7 +451,7 @@ void RecordTextWriter::xfrTime(const uint32_t& val)
struct tm tm;
time_t time=val; // Y2038 bug!
#ifndef WIN32
- gmtime_r(&time, &tm);
+ Utility::gmtime_r(&time, &tm);
#else
struct tm* tmptr;
tmptr=gmtime(&time);
View
@@ -277,3 +277,28 @@ time_t Utility::timegm(struct tm *const t)
return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
}
+void Utility::gmtime_r(const time_t *timer, struct tm *tmbuf) {
+
+ int monthdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+ int days = *timer / 86400;
+ int leapdays = (days + 671) / 1461;
+ int leapydays = (days + 365) / 1461;
+
+ tmbuf->tm_hour = *timer / 3600 % 24;
+ tmbuf->tm_min = *timer / 60 % 60;
+ tmbuf->tm_sec = *timer % 60;
+
+ tmbuf->tm_year = (days - leapdays) / 365 + 70;
+ tmbuf->tm_yday = days - leapydays - (tmbuf->tm_year - 70) * 365 + 1;
+
+ tmbuf->tm_mon = 0;
+ tmbuf->tm_mday = tmbuf->tm_yday;
+ monthdays[1] += isleap(tmbuf->tm_year + 1900);
+ while (monthdays[tmbuf->tm_mon] < tmbuf->tm_mday) {
+ tmbuf->tm_mday -= monthdays[tmbuf->tm_mon];
+ tmbuf->tm_mon++;
+ }
+
+ tmbuf->tm_wday = (days + 4) % 7; // Day 0 is magic thursday ;)
+ tmbuf->tm_isdst = 0;
+}
View
@@ -208,7 +208,8 @@ public:
static void usleep( unsigned long usec );
static time_t timegm(struct tm *tm);
-
+
+ static void gmtime_r(const time_t *timer, struct tm *tmbuf);
};

0 comments on commit e4faf74

Please sign in to comment.