Ημέρες – Μήνες – Έτη
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 (πέρα των άλλων που έχουν υλοποιηθεί παλαιότερα).