# Datumsdifferenz in Tagen ermitteln



## Flow24 (27. Mai 2005)

Hallo zusammen,

in meiner Anwendung habe ich zwei Datums-Variablen vom Typ GregorianCalendar.
Nun muss ich die Tage ermitteln, die zwischen diesen beiden Daten liegen.
Ich habe es mit folgendem Ansatz probiert:


```
GregorianCalendar heute = new GregorianCalendar();
	        GregorianCalendar Faellig2 = Faellig;
	        Tage = 0;
	        
	        while (!Faellig2.equals(heute))
	        {
	        	Faellig2.add(Calendar.DATE, 1);
	        	Tage = Tage + 1;
	        		        	
	        }
```

Das Ganze hat Java aber wohl aufgrund der teilweise sehr großen Datums-Abstände (bis zu 1000 Tage)
überfordert, zumal diese Schleife in einer anderen umfangreichen Schleife steht.

Gibt es irgendeine Java-Funktion mit der Datumsabstände berechnet werden können?

Gruß Flow24


----------



## mic_checker (27. Mai 2005)

Schon z.B. das angeguckt ?


----------



## Flow24 (27. Mai 2005)

Also ne konkrete Lösung wird aus dem Thread auch nicht klar (zumal einer der
wichtigsten Links auf eine Beispiel verweist, dass es nicht mehr gibt).

Kann mir jemand weiterhelfen?

Gruß Flow24


----------



## L-ectron-X (28. Mai 2005)

Mit

```
long millis = calender.getTimeInMillis();
```
bekommst du das Datum in Millisekunden umgerechnet, die seit dem 1.1.1970 vergangen sind.
Subtrahiere so beide Werte voneinander und verwandle das Ergebnis mit

```
calender.setTimeInMillis(millis);
```
wieder in ein Calender-Objekt. Und das kannst du mit den entsprechenden Feldvariablen zusammensetzen, wie du es brauchst.


----------



## späterGast (11. Nov 2006)

Hallo,
habe mir die Threads zum Thema durchgelesen aber irgendwo einen Denkfehler.
Ich möchte also eine Datumsdifferenz ermitteln, um dann auf Basis der ausgerechneten Tage ein Skonto oder Verzugszinsen zu berechnen. Es scheitert aber schon an der Datumsdifferenz in Millisekunden.
Folgender Code:

```
import java.util.Scanner;
import java.util.Calendar;
import java.util.GregorianCalendar;
class Ueberweisung4
{
  public  static  void main(String[] args)
  {
   GregorianCalendar heute = new GregorianCalendar();
   Scanner eing = new Scanner(System.in);
   System.out.println("Jahr:" ); int j = eing.nextInt();
   System.out.println("Monat:" ); int m = eing.nextInt()-1;
   //wegen januar=0
   System.out.println("Tag:" ); int t = eing.nextInt();
   GregorianCalendar rd = new GregorianCalendar(j,m,t);
   //jetzt Tip von L-ectron-X den ich wohl nicht verstand
   long millisrd = calendar.getTimeInMillis(rd);
   long millisheute = calendar.getTimeInMillis(heute);
   long diffmillis  =  millisheute -  millisrd;
   System.out.println(diffmillis );
  }
}
```
bringt diese Fehlermeldungen:

```
Ueberweisung4.java:17: cannot find symbol
symbol  : variable calendar
location: class Ueberweisung4
   long millisrd = calendar.getTimeInMillis(rd);
Ueberweisung4.java:18: cannot find symbol
symbol  : variable calendar
location: class Ueberweisung4
   long millisheute = calendar.getTimeInMillis(heute);
```

In der API habe ich nichts gefunden was mir weiter hilft


----------



## SlaterB (11. Nov 2006)

> getTimeInMillis(rd);

wie kommst du darauf, dass man dieser Operation ein Parameter übergeben könnte?
was ist deine Motivation dafür was erwartest du was da passiert?

du meinst sicherlich 
rd.getTimeInMillis();

---------

> In der API habe ich nichts gefunden was mir weiter hilft

ja wonach hast du denn gesucht? 

nach der Operation getTimeInMillis() im Index?
http://java.sun.com/j2se/1.5.0/docs/api/index-files/index-1.html

hättest du gefunden,


nach den Klassen Calendar oder GregorianCalendar, um die es in diesem Thread geht, 
die man leicht von einem Objektnamen oder evtl. falsch geschriebenen Klassennamen 'calendar' hätte ableiten können?

auch dort wärst du auf die Operaion getTimeInMillis() gestoßen


----------



## L-ectron-X (11. Nov 2006)

@SlaterB: Da ist nichts falsch geschrieben. Ich habe oben von einem Objekt geschrieben, welche mit klein geschriebenen Variablen referenziert werden. Es fehlt eigentlich nur die Stelle, an der ich das Calander-Objekt besorge.

```
Calendar calendar = Calendar.getInstance(); //besorgt das aktuelle Datum/Zeit
```

@späterGast: Das GregorianCalendar-Objekt kennt natürlich auch die getTimeInMillis()-Methode, weil es von Calendar erbt.
Und so kannst du von beiden Calendar-Objekten die Millisekunden ermitteln, subtrahieren und den ermittelten Wert in ein Calendar-Objekt schreiben und ausgeben. Die Arbeit kannst du komplett der Klasse Calendar überlassen.

```
long millis = calendar.getTimeInMillis() - rd.getTimeInMillis(); //heute minus ein Datum in der Vergangenheit
calendar.setTimeInMillis(millis);
System.out.println("Verstrichene Tage: " + calendar.get(Calendar.DAY_OF_YEAR));
```

Dein Programm kann also so aussehen:

```
import java.util.*;

public class CalendarTest {

   public static void main(String[] args) {
      Scanner eing = new Scanner(System.in);
      System.out.print("Jahr : "); int j = eing.nextInt();
      System.out.print("Monat: "); int m = eing.nextInt()-1;
      System.out.print("Tag  : "); int t = eing.nextInt();
      GregorianCalendar rd = new GregorianCalendar(j,m,t);

      Calendar calendar = Calendar.getInstance();
      long millis = calendar.getTimeInMillis() - rd.getTimeInMillis();
   
      calendar.setTimeInMillis(millis);
      System.out.println("Verstrichene Tage: " + (calendar.get(Calendar.DAY_OF_YEAR)-1));
   }
}
```

Es bleibt nur noch zu sagen, dass sich die Ausgabe mit Hilfe von _Calendar.DAY_OF_YEAR_ nur auf 364 Tage beschränkt. Darüber hinaus müsste man die Ausgabe bei jahresübergreifenden Ergebnissen mit einer Berechnung erledigen.
Dazu müssen lediglich die *Zeilen 15 und 16* mit folgender Zeile ersetzt werden:

```
System.out.println("Verstrichene Tage: " +millis/86400000); //ein Tag hat 86400000 Millisekunden
```
Diese Variante würde ich persönlich immer vorziehen.


----------



## SlaterB (11. Nov 2006)

L-ectron-X hat gesagt.:
			
		

> @SlaterB: Da ist nichts falsch geschrieben. Ich habe oben von einem Objekt geschrieben, welche mit klein geschriebenen Variablen referenziert werden.



ich zählte nur alle möglichen Gedankengänge auf, 
und dazu gehörte bei mir auch eine statische Operation in Calendar 
(ein Synonym für System.currentTimeInMillies())

habe dann natürlich in der API erkannt was Sache ist, dafür hat man ja die API


----------



## späterGast (11. Nov 2006)

:toll: Danke an alle, die sich bemühten.:toll:  Die Zusammenhänge sind mir klarer geworden und vor allem dieser Umgang mit der API.  Ich habe nicht effektiv gesucht, aber über den Index war es ein Kinderspiel. Vielleicht sollte ich hellere Stunden nehmen und nicht den Namen verwirklichen.  :wink:


----------

