Conversion of Microsoft DATE to int day, int month, int year?

Any system or free code to convert the DATE value to the integer values representing the day, month, year?

Hi experts,

I need to convert the Microsoft data type DATE (typedef double, if I am not mistaken) to the integer values. So far I have found the code by Victor Vogelpoel http://www.codeproject.com/KB/datetime/exceldmy.aspx. Is there any "more official" code by Microsoft or any other proven code?

The value was read from a MS Access database using Microsoft.Jet.OLEDB.4.0 + ADO Recordset, thus getting the VARIANT value of the VT_DATE (the _variant_t v variable inside C++ source, v.date value).

Thanks,
    Petr
/*
    Excel serial date to Day, Month, Year and vise versa
    By Victor Vogelpoel http://www.codeproject.com/KB/datetime/exceldmy.aspx
*/
void ExcelSerialDateToDMY(DATE SerialDate, int &nDay, 
                          int &nMonth, int &nYear)
{
    int nSerialDate = static_cast<int>(SerialDate);
 
    // Excel/Lotus 123 have a bug with 29-02-1900. 1900 is not a
 
    // leap year, but Excel/Lotus 123 think it is...
 
    if (nSerialDate == 60)
    {
        nDay    = 29;
        nMonth    = 2;
        nYear    = 1900;
 
        return;
    }
    else if (nSerialDate < 60)
    {
        // Because of the 29-02-1900 bug, any serial date 
 
        // under 60 is one off... Compensate.
 
        nSerialDate++;
    }
 
    // Modified Julian to DMY calculation with an addition of 2415019
 
    int l = nSerialDate + 68569 + 2415019;
    int n = int(( 4 * l ) / 146097);
            l = l - int(( 146097 * n + 3 ) / 4);
    int i = int(( 4000 * ( l + 1 ) ) / 1461001);
        l = l - int(( 1461 * i ) / 4) + 31;
    int j = int(( 80 * l ) / 2447);
     nDay = l - int(( 2447 * j ) / 80);
        l = int(j / 11);
        nMonth = j + 2 - ( 12 * l );
    nYear = 100 * ( n - 49 ) + i + l;
}

Open in new window

LVL 29
peprAsked:
Who is Participating?
 
ZoppoConnect With a Mentor Commented:
Hi pepr,

there's a function VariantTimeToSystemTime - as arguments it has a double value represanting the DATA and a pointer to an SYSTEMTIME instance which get's filled - the SYSTEMTIME structure has members for year, month, day a.s.o.

Hope that helps,

ZOPPO
0
 
ZoppoCommented:
You could even use the COleDateTime class if you use MFC. This encapsulates calls to VariantTimeToSystemTime ...
0
 
peprAuthor Commented:
Yes, this is what I have searched for (VariantTimeToSystemTime -- http://msdn.microsoft.com/en-us/library/ms221440(VS.80).aspx).

Thanks!

Petr
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.