Ημέρες – Μήνες – Έτη

2009 Σεπτεμβρίου 19

Όσοι θέλουν τη διαφορά ημερομηνιών σε ημέρες μήνες έτη ας μην ψάξουν παραπέρα. Εγώ τη χρειάστηκα πρόσφατα και φαίνεται να δουλεύει σωστά (όσο μπόρεσα να την τεστάρω με δεδομένα και αποτελέσματα που είχα έτοιμα σε κάποια αρχεία excel.)

HRESULT DMYYears(DATE startDate, DATE endDate, LONG* pVal)
{
    if (endDate < startDate)
        return ERROR_BAD_ARGUMENTS;

    COleDateTime dtS(startDate);
    COleDateTime dtE(endDate);

    LONG diff = dtE.GetYear() - dtS.GetYear();
    if (diff > 0)
    {
        if (dtE.GetMonth() < dtS.GetMonth())
            --diff;
        else if (dtE.GetDay() < dtS.GetDay())
            --diff;
    }

    *pVal = diff;
    return S_OK;
}

HRESULT DMYMonths(DATE startDate, DATE endDate, LONG* pVal)
{
    if (endDate < startDate)
        return ERROR_BAD_ARGUMENTS;

    COleDateTime dtS(startDate);
    COleDateTime dtE(endDate);

    LONG diff = dtE.GetMonth() - dtS.GetMonth();

    if (dtE.GetDay() < dtS.GetDay())
        --diff;
    if (diff < 0)
        diff += 12;

    *pVal = diff;
    return S_OK;
}

HRESULT DMYDays(DATE startDate, DATE endDate, LONG* pVal)
{
    if (endDate < startDate)
        return ERROR_BAD_ARGUMENTS;

    COleDateTime dtS(startDate);
    COleDateTime dtE(endDate);
    COleDateTime dt;
    LONG diff = 0;

    if (dtE.GetDay() < dtS.GetDay())
    {
        if (dtS.GetMonth() < 12)
            dt = COleDateTime(dtS.GetYear(), dtS.GetMonth()+1, 1, 0, 0, 0);
        else
            dt = COleDateTime(dtS.GetYear()+1, 1, 1, 0, 0, 0);
        COleDateTimeSpan dtspan = dt - dtS;
        diff = dtspan.GetDays() + dtE.GetDay() - 1;
    }
    else
    {
        diff = dtE.GetDay() - dtS.GetDay();
    }

    *pVal = diff;
    return S_OK;
}

Και ο αντίστοιχος κώδικας σε C#

public class DMYDiff
{
    public static int DMYDays(DateTime startDate, DateTime endDate)
    {
        if (endDate < startDate)
        {
            throw new ArgumentException("Η endDate δεν μπορεί να είναι προγενέστερη της startDate", "endDate");
        }

        int diff = endDate.Year - startDate.Year;
        if (diff > 0)
        {
	        if (endDate.Month < startDate.Month)
		        --diff;
	        else if (endDate.Day < startDate.Day)
		        --diff;
        }

        return diff;
    }

    public static int DMYMonths(DateTime startDate, DateTime endDate)
    {
        if (endDate < startDate)
        {
            throw new ArgumentException("Η endDate δεν μπορεί να είναι προγενέστερη της startDate", "endDate");
        }

        int diff = endDate.Month - startDate.Month;

        if (endDate.Day < startDate.Day)
            --diff;
        if (diff < 0)
            diff += 12;

        return diff;
    }

    public static int DMYYears(DateTime startDate, DateTime endDate)
    {
        if (endDate < startDate)
        {
            throw new ArgumentException("Η endDate δεν μπορεί να είναι προγενέστερη της startDate", "endDate");
        }
        DateTime dt;
        int diff = 0;

        if (endDate.Day < startDate.Day)
        {
            if (startDate.Month < 12)
                dt = new DateTime(startDate.Year, startDate.Month + 1, 1, 0, 0, 0);
            else
                dt = new DateTime(startDate.Year + 1, 1, 1, 0, 0, 0);
            TimeSpan startDatepan = dt - startDate;
            diff = startDatepan.Days + endDate.Day - 1;
        }
        else
        {
            diff = endDate.Day - startDate.Day;
        }

        return diff;
    }

}

Κατεβάστε τον κώδικα σε C# μαζί με το dll, ή το ενημερωμένο αρχείο των utilities (DVAUtils.dll) που εξάγει το σχετικό DVA.DateDiff COM Object (πέρα των άλλων που έχουν υλοποιηθεί παλαιότερα).

Χωρίς σχόλια ακόμα

Υποβολή απάντησης

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS