February 16, 2008 Dates | ||||
---|---|---|---|---|
| ||||
hi, i need to convert an ole date (double) to a std.date date that i can display as a string. i tried: public Date convertMSCDate(double dtSrc) { // source code copied from MFC 4.21 and modified long nDays; // Number of days since Dec. 30, 1899 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 // values in terms of year month date. int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; Date tmpDate; const int rgMonthDays[] = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; const double HALF_SECOND = (1.0/172800.0); double dblDate = dtSrc; // temporary serial date // If a valid date, then this conversion should not overflow nDays = cast(long)dblDate; // Round to the second dblDate += ((dtSrc > 0.0) ? HALF_SECOND : -HALF_SECOND); // Add days from 1/1/0 to 12/30/1899 nDaysAbsolute = cast(long)dblDate + 693959L; dblDate = abs(dblDate); nSecsInDay = cast(long)((dblDate - floor(dblDate)) * 86400.); // Leap years every 4 yrs except centuries not multiples of 400. n400Years = cast(long)(nDaysAbsolute / 146097L); // Set nDaysAbsolute to day within 400-year block nDaysAbsolute %= 146097L; // -1 because first century has extra day n400Century = cast(long)((nDaysAbsolute - 1) / 36524L); // Non-leap century if (n400Century != 0) { // Set nDaysAbsolute to day within centurY nDaysAbsolute = (nDaysAbsolute - 1) % 36524L; // +1 because 1st 4 year increment has 1460 days n4Years = cast(long)((nDaysAbsolute + 1) / 1461L); if (n4Years != 0) n4Day = cast(long)((nDaysAbsolute + 1) % 1461L); else { bLeap4 = false; n4Day = cast(long)nDaysAbsolute; } } else { // Leap century - not special case! n4Years = cast(long)(nDaysAbsolute / 1461L); n4Day = cast(long)(nDaysAbsolute % 1461L); } if (bLeap4) { // -1 because first year has 366 days n4Yr = (n4Day - 1) / 365; if (n4Yr != 0) n4Day = (n4Day - 1) % 365; } else { n4Yr = n4Day / 365; n4Day %= 365; } tm_year = cast(int)(n400Years * 400 + n400Century * 100 + n4Years * 4 + n4Yr); // Handle leap year: before, on, and after Feb. 29. if (n4Yr == 0 && bLeap4 && n4Day == 59) { /* Feb. 29 */ tm_mon = 2; tm_mday = 29; } else { if (n4Yr == 0 && bLeap4 && n4Day >= 59) --n4Day; // Make n4DaY a 1-based day of non-leap year and compute // month/day for everything but Feb. 29. ++n4Day; // Month number always >= n/32, so save some loop time */ for (tm_mon = cast(int)((n4Day <> 5) + 1); n4Day > rgMonthDays[tm_mon]; tm_mon++) {} tm_mday = cast(int)(n4Day - rgMonthDays[tm_mon-1]); } if (nSecsInDay == 0) tm_hour = tm_min = tm_sec = 0; else { tm_sec = cast(int)(nSecsInDay % 60L); nMinutesInDay = nSecsInDay / 60L; tm_min = cast(int)(nMinutesInDay % 60); tm_hour = cast(int)(nMinutesInDay / 60); } tmpDate.year = tm_year - 1900; tmpDate.month = tm_mon - 1; tmpDate.day = tm_mday; tmpDate.hour = tm_hour; tmpDate.minute = tm_min; tmpDate.second = tm_sec; return tmpDate; /+ setYear(tm_year - 1900); setMonth(tm_mon - 1); super.setDate(tm_mday); // resolves ambiguity between OleDate.setDate and java.util.Date.setDate setHours(tm_hour); setMinutes(tm_min); setSeconds(tm_sec); +/ } } seems like there is no way to do it. any help??? |
Copyright © 1999-2021 by the D Language Foundation