Dates

sobie sobie at sobie.com
Sat Feb 16 11:28:25 PST 2008


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???



More information about the Digitalmars-d-learn mailing list