+ // calculate the century
+ int temp = (jdn + JDN_OFFSET) * 4 - 1;
+ int century = temp / DAYS_PER_400_YEARS;
+
+ // then the year and day of year (1 <= dayOfYear <= 366)
+ temp = ((temp % DAYS_PER_400_YEARS) / 4) * 4 + 3;
+ int year = (century * 100) + (temp / DAYS_PER_4_YEARS);
+ int dayOfYear = (temp % DAYS_PER_4_YEARS) / 4 + 1;
+
+ // and finally the month and day of the month
+ temp = dayOfYear * 5 - 3;
+ int month = temp / DAYS_PER_5_MONTHS;
+ int day = (temp % DAYS_PER_5_MONTHS) / 5 + 1;
+
+ // month is counted from March - convert to normal
+ if ( month < 10 )
+ {
+ month += 3;
+ }
+ else
+ {
+ year += 1;
+ month -= 9;
+ }
+
+ // year is offset by 4800
+ year -= 4800;
+
+ // check that the algorithm gave us something reasonable
+ wxASSERT_MSG( (0 < month) && (month <= 12), _T("invalid month") );
+ wxASSERT_MSG( (1 <= day) && (day < 32), _T("invalid day") );
+ wxASSERT_MSG( (INT_MIN <= year) && (year <= INT_MAX),
+ _T("year range overflow") );
+
+ // construct Tm from these values
+ Tm tm;
+ tm.year = (int)year;
+ tm.mon = (Month)(month - 1); // algorithm yields 1 for January, not 0
+ tm.mday = (wxDateTime_t)day;
+ tm.msec = timeOnly % 1000;
+ timeOnly -= tm.msec;
+ timeOnly /= 1000; // now we have time in seconds
+
+ tm.sec = timeOnly % 60;
+ timeOnly -= tm.sec;
+ timeOnly /= 60; // now we have time in minutes
+
+ tm.min = timeOnly % 60;
+ timeOnly -= tm.min;
+
+ tm.hour = timeOnly / 60;
+
+ return tm;