Compte de quart entre les dates

Je veux calculer le nombre total de sortingmestres (d’une année) dans la période donnée.

par exemple:

start date = 1-june -2009 end date = 18-july-2011 count should be = 10. one more start date = 4-Jan-2009 end date = 27-oct -2010 count =8. 

Je n’ai pas réussi à obtenir le résultat correct.

Votre exemple est faux: il n’y a que 7 sortingmestres entre le 4-Jan-2009 et le 27-oct -2010 4-Jan-2009

Vous pouvez simplement append une référence à Microsoft.VisualBasic.dll à votre projet et utiliser DateDiff :

VB:

 Public Shared Function getQuartersBetween(ByVal d1 As Date, ByVal d2 As Date) As Int32 Return DateDiff(DateInterval.Quarter, d1, d2) End Function 

C #:

 public static int getQuartersBetween(System.DateTime d1, System.DateTime d2) { return Microsoft.VisualBasic.DateAndTime.DateDiff(DateInterval.Quarter, d1, d2); } 

ou vous pouvez écrire votre propre implémentation:

 public class Quarter { public static long GetQuarters(DateTime dt1, DateTime dt2) { double d1Quarter = GetQuarter(dt1.Month); double d2Quarter = GetQuarter(dt2.Month); double d1 = d2Quarter - d1Quarter; double d2 = (4 * (dt2.Year - dt1.Year)); return Round(d1 + d2); } private static int GetQuarter(int nMonth) { if (nMonth <= 3) return 1; if (nMonth <= 6) return 2; if (nMonth <= 9) return 3; return 4; } private static long Round(double dVal) { if (dVal >= 0) return (long)Math.Floor(dVal); return (long)Math.Ceiling(dVal); } } 

ou en VB.NET:

 Public Class Quarter Public Shared Function GetQuarters(ByVal dt1 As DateTime, ByVal dt2 As DateTime) As Long Dim d1Quarter As Double = GetQuarter(dt1.Month) Dim d2Quarter As Double = GetQuarter(dt2.Month) Dim d1 As Double = d2Quarter - d1Quarter Dim d2 As Double = (4 * (dt2.Year - dt1.Year)) Return Round(d1 + d2) End Function Private Shared Function GetQuarter(ByVal nMonth As Integer) As Integer If nMonth <= 3 Then Return 1 End If If nMonth <= 6 Then Return 2 End If If nMonth <= 9 Then Return 3 End If Return 4 End Function Private Shared Function Round(ByVal dVal As Double) As Long If dVal >= 0 Then Return CLng(Math.Floor(dVal)) End If Return CLng(Math.Ceiling(dVal)) End Function End Class 

Code pour vous: Essayez ci-dessous le code

  public static void Main() { //Application.Run(new XmlTreeDisplay()); int monthdiuff = monthDifference(Convert.ToDateTime("01/04/09"), Convert.ToDateTime("10/27/10")); Console.WriteLine(monthdiuff); int totalQuater = (monthdiuff / 3) + (monthdiuff%3); Console.WriteLine(totalQuater); Console.ReadLine(); } private static int monthDifference(DateTime startDate, DateTime endDate) { int monthsApart = 12 * (startDate.Year - endDate.Year) + startDate.Month - endDate.Month; return Math.Abs(monthsApart); } 

Sans un code à examiner, je ne peux pas vous aider à trouver votre problème exact.

Si c’était moi, je trouverais probablement la différence entre les dates en jours, puis le divise en nombre de jours sur un sortingmestre (91 ou plus). Je suis sûr que C # a une sorte de module d’parsing de date qui peut lire les dates sous forme de chaîne, ce qui vous donne deux objects que vous pouvez ensuite soustraire pour trouver la différence en jours.

Ceci est une forme brute de calcul des sortingmestres en fonction de vos hypothèses, vous pouvez choisir de le modifier car il fonctionne assez bien

 DateTime dt1 = new DateTime(2009, 1, 1);// new DateTime(2009, 6, 1); DateTime dt2 = new DateTime(2010, 10, 27);// new DateTime(2011, 7, 18); if (dt1.Month < 4) dt1 = new DateTime(dt1.Year,1,1); else if (dt1.Month < 7) dt1 = new DateTime(dt1.Year,4,1); else if (dt1.Month < 10) dt1 = new DateTime(dt1.Year,7,1); else dt1 = new DateTime(dt1.Year,10,1); if (dt2.Month < 4) dt2 = new DateTime(dt2.Year, 3, DateTime.DaysInMonth(dt2.Year, 3)); else if (dt2.Month < 7) dt2 = new DateTime(dt2.Year, 6, DateTime.DaysInMonth(dt2.Year, 6)); else if (dt2.Month < 10) dt2 = new DateTime(dt2.Year, 9, DateTime.DaysInMonth(dt2.Year, 9)); else dt2 = new DateTime(dt2.Year, 12, DateTime.DaysInMonth(dt2.Year, 12)); TimeSpan ts = dt2 - dt1; int quarters = (int) ts.TotalDays/90; Console.WriteLine(quarters); 

Je base les dates au début et à la fin des sortingmestres comme vous le souhaitez, puis je suppose que, pendant un sortingmestre à 90 jours, le diff devient int. Fonctionne pour vos exemples cités, voyez si cela vous convient assez bien

Si la définition du sortingmestre est une différence de 90 jours, il est facile bien sûr:

  internal static int GetNumberOfQuarters(DateTime p_DtStart, DateTime p_DtEnd) { TimeSpan span = p_DtEnd.Subtract(p_DtStart); return (int)span.TotalDays % 90; } 

Mais ce n’est pas ce que vous recherchez. Qu’en est-il (non testé mais vous aurez l’idée)

 internal static class DateTimeTools { internal static int GetNumberOfQuartersBetweenDates(DateTime startDate, DateTime endDate) { int iYearStart, iYearEnd, iMonthStart, iMonthEnd, iDayStart, iDayEnd; iYearStart = startDate.Year; iYearEnd = endDate.Year; iMonthStart = startDate.Month; iMonthEnd = endDate.Month; iDayStart = startDate.Day; iDayEnd = endDate.Day; int iYearDiff, iQuarterDiff, iDayDiff; iYearDiff = iYearEnd - iYearStart; iQuarterDiff = iMonthEnd % 3 - iMonthStart % 3; iDayDiff = iDayEnd - iDayStart; int iNumOfQuarters = 0; // at least a year difference? if ((iYearDiff > 0 && iQuarterDiff > 0) || iYearDiff > 0 && iQuarterDiff == 0 && iDayDiff >= 0) { iNumOfQuarters = iYearDiff * 4 + iQuarterDiff; } // at least a quarter difference? // within different years if ((iYearDiff > 0 && iQuarterDiff <= 0)) // eg, dec 2010 - feb 2011 iYearDiff 1 iQuarterDiff -3 { if ((iQuarterDiff == -3 && iDayDiff >= 0) || iQuarterDiff > -3) { iNumOfQuarters = iQuarterDiff + 4; } } // within the same year if (iYearDiff == 0 && iQuarterDiff > 0) { if ((iQuarterDiff == 1 && iDayDiff >= 0) || iQuarterDiff > 1) { iNumOfQuarters = iQuarterDiff; } } return iNumOfQuarters; } } 

Cordialement, Nico