# Tage aus zwei Datumsangaben berechnen



## starbug08 (31. Mrz 2011)

hi leut habe ne aufgabe bekommen in der ich die anzahl von tagen berechnen soll. es geht um eine methode die ein start und ein end datum übergeben bekommt. eigentlich soll ich die klasse date verwenden aber damit klaptts leider gar nich also hab ich gregoiancalendar genommen aber funzt auch nich wirklich vielleicht kann mir jemand helfen, hier der code:


```
public int berechneMiete(GregorianCalendar start,GregorianCalendar ende)
	{
		start = new GregorianCalendar();
		ende = new GregorianCalendar();
		
		long dif = ende.getTimeInMillis() - start.getTimeInMillis();
		int tage = (int)(dif/(1000*60*60*24));
		return tage;
		
	}
```


----------



## Michael... (31. Mrz 2011)

Da die Methode die übergebenen Referenzen überschreibt, kann da immer nur 0 rauskommen.


starbug08 hat gesagt.:


> [JAVA=3]		start = new GregorianCalendar();
> ende = new GregorianCalendar();[/code]


----------



## SlaterB (31. Mrz 2011)

gibt es Uhrzeiten in den Dates? wenn ja dann würde Tag 1 20.00 - Tag 2 19.30 bei dir 0 Tage ergeben,
auf jeden Fall sollte man dies beim Wechsel Sommer/ Winterzeit bedenken,

wenn alle Tage die gleiche Uhrzeit haben, z.B. 0:00,  dan kann man problemlos einige Stunden draufaddieren um diesen unvermeidbaren Wechsel zu behandeln,
aber eigentlich ist das auch nur für Dates interessant,
wenn du schon Calendar-Objekte hast ist es ja günstiger dort mit get(DATE_OF_YEAR) usw. direkt in Tagen zu rechnen,
ok, paar Probleme mit Jahreswechsel denkbar, Anzahl Tage in Schaltjahren, dann mag die long-Berechnung doch auch hier einfacher sein


----------



## André Uhres (31. Mrz 2011)

Oder so, wenn man's unabhängig von bestehenden Klassen machen will:


```
public class MyDateDemo {

    public MyDateDemo() {
        MyDate start = new MyDate(2011, 1, 1);
        MyDate ende = new MyDate(2012, 1, 1);
        int berechneMiete = berechneMiete(start, ende);
        System.out.println("start = " + start);
        System.out.println("ende = " + ende);
        System.out.println("berechneMiete = " + berechneMiete);
    }

    public int berechneMiete(final MyDate start, final MyDate ende) {
        int tage = (int) (MyDate.toDay(ende) - MyDate.toDay(start));
        return tage;

    }

    public static void main(final String[] args) {
        MyDateDemo newMain = new MyDateDemo();
    }
}

class MyDate {

    private final long year;
    private final long month;
    private final long day;

    MyDate(final long year, final long month, final long day) {
        this.year = year;
        this.month = month;
        this.day = day;

    }

    public long getDay() {
        return day;
    }

    public long getMonth() {
        return month;
    }

    public long getYear() {
        return year;
    }

    @Override
    public String toString() {
        return "MyDate{" + "year=" + year + ", month=" + month + ", day=" + day + '}';
    }

    public static long toDay(final MyDate date) {
        //Note that dates before Oct. 1582 are inaccurate
        long month = (date.getMonth() + 9) % 12;
        long year = date.getYear() - month / 10;
        return year * 365 + year / 4 - year / 100 + year / 400
                + (month * 306 + 5) / 10 + (date.getDay() - 1);
    }
}
```

Gruß,
André


----------

