World of Web

Tages differenz berechnen

by on Okt.01, 2010, under Kurztutorials

Nehmen wir an, wir müssten aus den Zwei Daten 20081212 und 20090224 die Differenz der Tage bilden.

20081212 repräsentiert hierbei den 12.12.2008 und 20090224 den 24.02.2009.

Funktion zum splitten des Datums

Zunächst einmal brauchen wir Funktionen, die uns aus den gegebenen Integer-Variablen das Jahr, den Monat und die Tage „filtert“.

Meine Version dieser Funktionen sieht so aus:

public static int getYear(int date)
{
   int year = date / 10000;
   return year;
}
 
public static int getMonth(int date)
{
   string sDate = Convert.ToString(date);
   sDate = sDate.Substring(4, 2);
   int iDate = Convert.ToInt32(sDate);
   return iDate;
}
 
public static int getDay(int date)
{
   string sDate = Convert.ToString(date);
   sDate = sDate.Substring(6, 2);
   int iDate = Convert.ToInt32(sDate);
   return iDate;
}

Das Jahr wird berechnet, indem man die Zahl einfach durch 10.000 teilt. Da beim Variablen-Typ Integer immer eine Ganzzahldivision ausgeführt wird, werden die Dezimalstellen einfach weggestrichen.

Bei der Monat und Tage Berechnung funktioniert dieser Trick leider nicht.

Hier werden die Integer-Variablen zu Strings umgewandelt, und danach die String-Funktion Substring aufgerufen, diese filtert uns beginnend ab Zeichen 4 (bzw. 6 beim Tag) die nächsten 2 Zeichen.

Nun benötigen wir, neben der eigentlichen Berechnungs-Funktion, noch 3 weitere Funktionen:

  • Überprüfung ob das Jahr ein Schaltjahr ist oder nicht
  • Berechnung der Tage der Monate
  • Berechnung der Tage des Jahres

Funktion 1: Überprüfung ob das Jahr ein Schaltjahr ist oder nicht

public static bool calculateLeapYear(int year)
{
   if ((year % 400) == 0)
      return true;
   else if ((year % 4) == 0 && (year % 100) != 0)
      return true;
   else
      return false;
}

Genaueres zur Schaltjahr-Berechnung bei Wikipedia

Funktion 2: Berechnung der Tage der Monate:

public static int getDayCountMonth(int month, int year)
{
   if (month == 01 || month == 03 || month == 05 || month == 07 || month == 08 || month == 10 || month == 12)
      return 31;
   else if (month == 02)
   {
      if (calculateLeapYear(year))
         return 29;
      else
         return 28;
   }
   else
      return 30;
}

Funktionsweise: Einfache Rückgabe der Tagesanzahl des Monats

Funktion 3: Berechnung der Tage des Jahres:

public static int getDayCountYear(int year)
{
   int sum = 0;
   for (int i = 12; i > 0; i--)
   {
      sum += getDayCountMonth(i, year);
   }
   return sum;
}

Schleifendurchlauf, der die Tage der Monate des Jahres aufsummiert und dabei überprüft, ob es sich um ein Schaltjahr handelt, oder nicht.

Eigentliche Berechnungs-Funktion:

public static int calculateDayCount(int dateOne, int dateTwo)
{
   int yearOne, yearTwo, monthOne, monthTwo, dayOne, dayTwo;
   yearOne = getYear(dateOne);
   monthOne = getMonth(dateOne);
   dayOne = getDay(dateOne);
   yearTwo = getYear(dateTwo);
   monthTwo = getMonth(dateTwo);
   dayTwo = getDay(dateTwo);
   int dayCountDateOne = 0;
   for (int i = monthOne; i > 0; i--)
   {
      dayCountDateOne += getDayCountMonth(i, yearOne);
   }
   dayCountDateOne += dayOne;
   int dayCountDateTwo = 0;
   if (yearTwo > yearOne)
   {
      for (int i = yearTwo; i > yearOne; i--)
      {
         dayCountDateTwo += getDayCountYear(i);
      }
   }
   for (int i = monthTwo; i > 0; i--)
   {
      dayCountDateTwo += getDayCountMonth(i, yearOne);
   }
   dayCountDateTwo += dayTwo;
   int dayDiff = dayCountDateTwo - dayCountDateOne;
   return dayDiff;
}

Die Funktion Berechnet die Gesamtanzahl der Tage des ersten Datums und die Gesamtanzahl der Tage des zweiten Datums (ausgehend vom Jahr des ersten Datums) und bildet anschließend die Differenz.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Post to Twitter Post to Plurk Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to MySpace Post to Ping.fm Post to Reddit Post to StumbleUpon

Share on Facebook




1 Comment for this entry

  • Wikert

    Well, I agree with what you wrote, but not with all of it. Regardless, it’s all great material. Thanks!

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Leave a Reply