Solved

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

Posted on 2008-06-24
3
1,420 Views
Last Modified: 2008-06-24
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

0
Comment
Question by:pepr
  • 2
3 Comments
 
LVL 31

Accepted Solution

by:
Zoppo earned 500 total points
ID: 21853532
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
 
LVL 31

Expert Comment

by:Zoppo
ID: 21853543
You could even use the COleDateTime class if you use MFC. This encapsulates calls to VariantTimeToSystemTime ...
0
 
LVL 29

Author Comment

by:pepr
ID: 21854128
Yes, this is what I have searched for (VariantTimeToSystemTime -- http://msdn.microsoft.com/en-us/library/ms221440(VS.80).aspx).

Thanks!

Petr
0

Featured Post

Revamp Your Training Process

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
MS Access populate a field based on 2 other form fields 14 36
get and set file atrributes 5 13
Bitwise and to sum elements 2 17
vb.net dbnull syntax 1 13
Describes a method of obtaining an object variable to an already running instance of Microsoft Access so that it can be controlled via automation.
As tax season makes its return, so does the increase in cyber crime and tax refund phishing that comes with it
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

730 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question