# Tage zwischen zwei Datumsdaten zählen



## 2komma7 (2. Aug 2007)

Liebe Gemeinde,

jetzt habe ich es dummerweise zuerst als Gast gepostet , daher hiermit ein neuer Versuch. Sorry!! 

seit 2-3 Tagen bekomme ich es nicht hin, die Tage zwischen 2 Datumsdaten, ohne Sa. und So., zu zählen. Ich möchte quasi die Nettoarbeitstage zählen, aber meine WHILE-Schleife verzählt sich ständig, da z. B. SATURDAY und SUNDAY nicht immer als solche erkannt werden. Bin schon leicht verzweifelt 


```
Calendar startCal = Calendar.getInstance();
Calendar endCal = Calendar.getInstance();
startCal.set(startY, startM, startD);
endCal.set(endY, endM, endD);
			
if (!(startCal.after(endCal))) // Enddatum >= Startdatum?
{
	int netHolidays = 0;
								
	while (!(startCal.after(endCal)))
	{
		if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY)
		{
		        if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)
		        {
	                ++netHolidays;
		        }
		}
		startCal.add(Calendar.DATE, 1);
	}
```

So gebe ich z. B. als Start- und Enddatum jew. ein und denselben Tag ein, der auf einen Sa. oder So. fällt, so wird trotzdem der Zähler "netHolidays" inkrementiert, da anscheinend Sa. oder So. nicht erkannt wird. Unter der Woche soll dies ja geschehen! Gebe ich ein Intervall über mehrere Tage, also auch über ein Wochenende hinweg, an, so verzählt er sich auch um 1 Tag (zuviel). Das passiert auch, wenn man ein Intervall über mehrere Wochen anlegt, er verzählt sich immer um 1 Tag...

Hat jemand eine Idee?


----------



## abollm (2. Aug 2007)

Ich habe mir mal vor einiger Zeit zu diesem Thema eine kleine Klasse geschirieben. Ich poste die einfach mal. Vielleicht kannst du damit etwas anfangen.


```
package de;
import java.text.*;
import java.util.*;

/** 
 * Created on 28.03.2005
 * 
 * AnzahlTage -- berechnet die Anzahl der Tage zwischen zwei Daten.
 * 
 * @author abollm
 * 
 */
public class AnzahlTage {
	public static void print(double value, String format)
	   {
	     DecimalFormat df = new DecimalFormat(format);
	     System.out.println(df.format(value));
	   }

	public static void main(String[] av) {
		/** Datum 1 */
		int y1 = 1984;
		int y2 = 1988;
		
		//GregorianCalendar d1 = new GregorianCalendar(y1,9,1,0,0);
		GregorianCalendar d1 = new GregorianCalendar(TimeZone.getTimeZone("ECT"));
		d1 = new GregorianCalendar(y1,2,15,0,0);
		SimpleDateFormat formater = new SimpleDateFormat("dd.MM.yyyy");
		System.out.println("d1 -> SimpleDateFormat: "+formater.format(d1.getTime()));
		//Date d1 = new GregorianCalendar(y1,0,1,0,0).getTime();

		/** Datum 2 */
		GregorianCalendar d2 = new GregorianCalendar(y2,11,31,0,0);
		System.out.println("d2 -> SimpleDateFormat: "+formater.format(d2.getTime())+"\n");

		// Hole Millisek. von jedem Datum und subtrahiere.
		//long diff = d2.getTime() - d1.getTime();
		long diff = d2.getTimeInMillis() -d1.getTimeInMillis();

		System.out.println("Anzahl Tage zwischen " + d1.get(Calendar.DATE)+ "." +
			       (d1.get(Calendar.MONTH)+1) + "." +
			       d1.get(Calendar.YEAR)  +
			" und " + d2.get(Calendar.DATE) + "." +
		       (d2.get(Calendar.MONTH)+1) + "." +
		       d2.get(Calendar.YEAR) + ": "+
			(diff / (1000*60*60*24)+1) +
			" Tage.");
		double jahreMitSJ = (diff / (1000*60*60*24)+1)/365.2475;  // Achtung - das alte Spiel mit _.0_ beachten!
		double jahreOhneSJ = (diff / (1000*60*60*24)+1)/365.0;  // Achtung - das alte Spiel mit _.0_ beachten!

		System.out.print("= Jahre mit SJ-Berücks.:  " ); print(jahreMitSJ, "#,###,##0.000000 ");
		System.out.print("= Jahre ohne SJ-Berücks.: " ); print(jahreOhneSJ, "#,###,##0.000000 Jahre ");
	}
}
```

Das hier gibt das obige Programm aus:

```
d1 -> SimpleDateFormat: 15.03.1984
d2 -> SimpleDateFormat: 31.12.1988

Anzahl Tage zwischen 15.3.1984 und 31.12.1988: 1753 Tage.
= Jahre mit SJ-Berücks.:  4,799485 
= Jahre ohne SJ-Berücks.: 4,802740 Jahre
```

BTW: SJ steht -- wie man leicht erraten kann -- für Schaltjahr.


----------



## 2komma7 (2. Aug 2007)

Danke, abollm, für Deine Anregungen. Die Lösung steht in meinem gleichnamigen Gast-Posting


----------

