-
- // Cache the date in days and time in fractional days
- long nDate;
- double dblTime;
-
- //It is a valid date; make Jan 1, 1AD be 1
- nDate = wYear*365L + wYear/4 - wYear/100 + wYear/400 +
- rgMonthDays[wMonth-1] + wDay;
-
- // If leap year and it's before March, subtract 1:
- if (wMonth <= 2 && bLeapYear)
- --nDate;
-
- // Offset so that 12/30/1899 is 0
- nDate -= 693959L;
-
- dblTime = (((long)wHour * 3600L) + // hrs in seconds
- ((long)wMinute * 60L) + // mins in seconds
- ((long)wSecond)) / 86400.;
-
- dtDest = (double) nDate + ((nDate >= 0) ? dblTime : -dblTime);
-
- return TRUE;
-}
-
-BOOL TmFromOleDate(DATE dtSrc, struct tm& tmDest)
-{
- // The legal range does not actually span year 0 to 9999.
- if (dtSrc > MAX_DATE || dtSrc < MIN_DATE) // about year 100 to about 9999
- return FALSE;
-
- long nDaysAbsolute; // Number of days since 1/1/0
- long nSecsInDay; // Time in seconds since midnight
- long nMinutesInDay; // Minutes in day
-
- long n400Years; // Number of 400 year increments since 1/1/0
- long n400Century; // Century within 400 year block (0,1,2 or 3)
- long n4Years; // Number of 4 year increments since 1/1/0
- long n4Day; // Day within 4 year block
- // (0 is 1/1/yr1, 1460 is 12/31/yr4)
- long n4Yr; // Year within 4 year block (0,1,2 or 3)
- BOOL bLeap4 = TRUE; // TRUE if 4 year block includes leap year
-
- double dblDate = dtSrc; // tempory serial date
-
- // Round to the second
- dblDate += ((dtSrc > 0.0) ? HALF_SECOND : -HALF_SECOND);
-
- nDaysAbsolute = (long)dblDate + 693959L; // Add days from 1/1/0 to 12/30/1899
-
- dblDate = fabs(dblDate);
- nSecsInDay = (long)((dblDate - floor(dblDate)) * 86400.);
-
- // Calculate the day of week (sun=1, mon=2...)
- // -1 because 1/1/0 is Sat. +1 because we want 1-based
- tmDest.tm_wday = (int)((nDaysAbsolute - 1) % 7L) + 1;
-
- // Leap years every 4 yrs except centuries not multiples of 400.
- n400Years = (long)(nDaysAbsolute / 146097L);
-
- // Set nDaysAbsolute to day within 400-year block
- nDaysAbsolute %= 146097L;
-
- // -1 because first century has extra day
- n400Century = (long)((nDaysAbsolute - 1) / 36524L);
-
- // Non-leap century
- if (n400Century != 0)