# mit Datum rechnen



## ballibum (7. Apr 2010)

Hallo liebe Community,
ich stehe gerade mal wieder aufm Schlach. Und zwar möchte ich gerne die Anzahl zwischen zwei Tagen berechnen.  Zum Beispiel:

1.4.2010 und 5.4.2010= als Formel 5.4.2010-1.4.2010 = 4Tage
dabei liegt das Datum in der Form JJJJMMTT vor (20090811).

GIbt es da eine elegante Lösungsmöglichkeit, damit auch Schaltjahre beachtet werden?

vielen Dank für eure Hilfe


----------



## FArt (7. Apr 2010)

Nutze mal die Forensuche.


----------



## Foermchen82 (7. Apr 2010)

Nimm jedes Datum als Millisekunden-Wert. Die kannst du Problemlos Subtrahieren und aus dem Ergebnis die Tage ermitteln


----------



## bemar (7. Apr 2010)

GregorianCalendar ist dein Freund ......


----------



## ballibum (7. Apr 2010)

okay, vielen dank. worum es mir hauptsächlich geht, kann ich das mit dem vordefinierten format jjjjmmtt machen??
mfg
ballibum


----------



## nrg (7. Apr 2010)

http://www.java-forum.org/java-basics-anfaenger-themen/98498-timestamp-datum.html


----------



## Tharsonius (7. Apr 2010)

Ich fand das mit dem Kalender irgendwann mal doof, kam damit nicht klar, da hab ich mir mal eine eigene Datumsklasse gebaut.

Ich nutz einfach mal die Gelegenheit die hier mal zu posten. Wenn sie wer verwenden mag, nur zu:


```
package basis;

import java.text.SimpleDateFormat;
import java.util.Date;

public final class Datum
{
	private int tag;
	private int monat;
	private int jahr;
	private int stunde;
	private int minute;
	private int sekunde;
	private boolean corrected;
	
	public Datum()
	{
		Date date = new Date();
		SimpleDateFormat datumsformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		setzeDatum(datumsformat.format(date));
	}

	public Datum(int jahr, int monat, int tag, int stunde, int minute, int sekunde)
	{
		this.tag = tag;
		this.monat = monat;
		this.jahr = jahr;
		this.stunde = stunde;
		this.minute = minute;
		this.sekunde = sekunde;
		corrected = false;
		check();
	}
	
	public Datum(String datum)
	{
		tag = 1;
		monat = 1;
		jahr = 1900;
		stunde = 0;
		minute = 0;
		sekunde = 0;
		corrected = true;
		int length = datum.length();
		if(length != 19)
			return;
		// Inhalt und Zeichen pruefen. Datum muss dieses Format haben: "jjjj-mm-tt hh:mm:ss"
		boolean ok = true;
		for(int i = 0; i < 19; i++)
		{
			char zeichen = datum.charAt(i);
			if(i == 4 || i == 7)
			{
				if (zeichen != '-')
					ok = false;
				continue;
			}
			if(i == 13 || i == 16)
			{
				if(zeichen != ':')
					ok = false;
				continue;
			}
			if(i == 10)
			{
				if(zeichen != ' ')
					ok = false;
				continue;
			}
			if(zeichen < '0' || zeichen > '9')
				ok = false;
		}
		if(ok == false)
			return;
		int wert = (datum.charAt(0) - '0') * 1000;
		wert = wert + ((datum.charAt(1) - '0') * 100);
		wert = wert + ((datum.charAt(2) - '0') * 10);
		wert = wert + (datum.charAt(3) - '0');
		jahr = wert;
		wert = (datum.charAt(5) - '0') * 10;
		wert = wert + (datum.charAt(6) - '0');
		monat = wert;
		wert = (datum.charAt(8) - '0') * 10;
		wert = wert + (datum.charAt(9) - '0');
		tag = wert;
		wert = (datum.charAt(11) - '0') * 10;
		wert = wert + (datum.charAt(12) - '0');
		stunde = wert;
		wert = (datum.charAt(14) - '0') * 10;
		wert = wert + (datum.charAt(15) - '0');
		minute = wert;
		wert = (datum.charAt(17) - '0') * 10;
		wert = wert + (datum.charAt(18) - '0');
		sekunde = wert;
		corrected = false;
		check();
	}

	public Datum(long datum)
	{
		tag = 1;
		monat = 1;
		jahr = 1900;
		stunde = 0;
		minute = 0;
		sekunde = 0;
		corrected = true;
		long temp = 19000101;
		temp = temp * 1000000;
		if(datum < temp)
			return;
		sekunde = (int)(datum % 100);
		datum = datum / 100;
		minute = (int)(datum % 100);
		datum = datum / 100;
		stunde = (int)(datum % 100);
		datum = datum / 100;
		tag = (int)(datum % 100);
		datum = datum / 100;
		monat = (int)(datum % 100);
		datum = datum / 100;
		jahr = (int)datum;
		corrected = false;
		check();
	}

	public final boolean istSchaltjahr()
	{
		if(jahr % 4 != 0)
		{
			return false;
		}
		else
		{
			if(jahr % 100 != 0)
			{
				return true;
			}
			else
			{
				if(jahr % 400 == 0)
					return true;
				else
					return false;
			}
		}
	}

	private final void check()
	{
		boolean datumok = true;
		if(jahr < 1900 || jahr > 2100)
			datumok = false;
		if(monat < 1 || monat > 12)
			datumok = false;
		if(tag < 1 || tag > 31)
			datumok = false;
		if(monat == 4 || monat == 6 || monat == 9 || monat == 11)
		{
			if(tag == 31)
				datumok = false;
		}
		if(monat == 2)
		{
			if(istSchaltjahr() == true)
			{
				if(tag > 29)
					datumok = false;
			}
			else
			{
				if(tag > 28)
					datumok = false;
			}
		}
		if(stunde < 0 || stunde > 23)
			datumok = false;
		if(minute < 0 || minute > 59)
			datumok = false;
		if(sekunde < 0 || sekunde > 59)
			datumok = false;
		if(datumok == false)
		{
			tag = 1;
			monat = 1;
			jahr = 1900;
			stunde = 0;
			minute = 0;
			sekunde = 0;
			corrected = true;
		}
	}

	public final void setzeDatum(int jahr, int monat, int tag, int stunde, int minute, int sekunde)
	{
		this.tag = tag;
		this.monat = monat;
		this.jahr = jahr;
		this.stunde = stunde;
		this.minute = minute;
		this.sekunde = sekunde;
		corrected = false;
		check();
	}

	public final void setzeDatum(String datum)
	{
		tag = 1;
		monat = 1;
		jahr = 1900;
		stunde = 0;
		minute = 0;
		sekunde = 0;
		corrected = true;
		int length = datum.length();
		if(length != 19)
		{
			return;
		}
		// Inhalt und Zeichen pruefen. Datum muss dieses Format haben: "jjjj-mm-tt hh:mm:ss"
		boolean ok = true;
		for (int i = 0; i < 19; i++)
		{
			char zeichen = datum.charAt(i);
			if(i == 4 || i == 7)
			{
				if(zeichen != '-')
					ok = false;
				continue;
			}
			if(i == 13 || i == 16)
			{
				if(zeichen != ':')
					ok = false;
				continue;
			}
			if(i == 10)
			{
				if(zeichen != ' ')
					ok = false;
				continue;
			}
			if(zeichen < '0' || zeichen > '9')
				ok = false;
		}
		if(ok == false)
		{
			return;
		}
		int wert = (datum.charAt(0) - '0') * 1000;
		wert = wert + ((datum.charAt(1) - '0') * 100);
		wert = wert + ((datum.charAt(2) - '0') * 10);
		wert = wert + (datum.charAt(3) - '0');
		jahr = wert;
		wert = (datum.charAt(5) - '0') * 10;
		wert = wert + (datum.charAt(6) - '0');
		monat = wert;
		wert = (datum.charAt(8) - '0') * 10;
		wert = wert + (datum.charAt(9) - '0');
		tag = wert;
		wert = (datum.charAt(11) - '0') * 10;
		wert = wert + (datum.charAt(12) - '0');
		stunde = wert;
		wert = (datum.charAt(14) - '0') * 10;
		wert = wert + (datum.charAt(15) - '0');
		minute = wert;
		wert = (datum.charAt(17) - '0') * 10;
		wert = wert + (datum.charAt(18) - '0');
		sekunde = wert;
		corrected = false;
		check();
	}
	
	public final void setzeDatum(long datum)
	{
		tag = 1;
		monat = 1;
		jahr = 1900;
		stunde = 0;
		minute = 0;
		sekunde = 0;
		corrected = true;
		long temp = 19000101;
		temp = temp * 1000000;
		if(datum < temp)
			return;
		sekunde = (int)(datum % 100);
		datum = datum / 100;
		minute = (int)(datum % 100);
		datum = datum / 100;
		stunde = (int)(datum % 100);
		datum = datum / 100;
		tag = (int)(datum % 100);
		datum = datum / 100;
		monat = (int)(datum % 100);
		datum = datum / 100;
		jahr = (int)datum;
		corrected = false;
		check();
	}
	
	public final void setzeTag(int wert)
	{
		tag = wert;
		corrected = false;
		check();
	}
	
	public final void setzeMonat(int wert)
	{
		monat = wert;
		corrected = false;
		check();
	}
	
	public final void setzeJahr(int wert)
	{
		jahr = wert;
		corrected = false;
		check();
	}
	
	public final void setzeStunde(int wert)
	{
		stunde = wert;
		corrected = false;
		check();
	}
	
	public final void setzeMinute(int wert)
	{
		minute = wert;
		corrected = false;
		check();
	}
	
	public final void setzeSekunde(int wert)
	{
		sekunde = wert;
		corrected = false;
		check();
	}

	public final int getTag()
	{
		return tag;
	}
	
	public final int getMonat()
	{
		return monat;
	}
	
	public final int getJahr()
	{
		return jahr;
	}
	
	public final int getStunde()
	{
		return stunde;
	}
	
	public final int getMinute()
	{
		return minute;
	}
	
	public final int getSekunde()
	{
		return sekunde;
	}
	
	public final String getDatumString()
	{
		StringBuilder sb = new StringBuilder();
		sb.append(jahr);
		sb.append("-");
		if(monat < 10)
			sb.append("0");
		sb.append(monat);
		sb.append("-");
		if(tag < 10)
			sb.append("0");
		sb.append(tag);
		sb.append(" ");
		if(stunde < 10)
			sb.append("0");
		sb.append(stunde);
		sb.append(":");
		if(minute < 10)
			sb.append("0");
		sb.append(minute);
		sb.append(":");
		if(sekunde < 10)
			sb.append("0");
		sb.append(sekunde);
		return sb.toString();
	}
	
	public final long getTimestamp()
	{
		long stamp;
		stamp = jahr;
		stamp = stamp * 100;
		stamp = stamp + monat;
		stamp = stamp * 100;
		stamp = stamp + tag;
		stamp = stamp * 100;
		stamp = stamp + stunde;
		stamp = stamp * 100;
		stamp = stamp + minute;
		stamp = stamp * 100;
		stamp = stamp + sekunde;
		return stamp;
	}
	
	public final boolean isDatumCorrected()
	{
		return corrected;
	}
	
	public final long getSekundenSeit1900()
	{
		long jahre = jahr - 1900;
		long schaltjahre = 0;
		if(jahre > 0)
		{
			schaltjahre = (jahre - 1) / 4;
		}
		long tage = jahre * 365;
		tage = tage + schaltjahre;
		switch(monat)
		{
			case 12:
				tage = tage + 30;
			case 11:
				tage = tage + 31;
			case 10:
				tage = tage + 30;
			case 9:
				tage = tage + 31;
			case 8:
				tage = tage + 31;
			case 7:
				tage = tage + 30;
			case 6:
				tage = tage + 31;
			case 5:
				tage = tage + 30;
			case 4:
				tage = tage + 31;
			case 3:
				tage = tage + 28;
				if(istSchaltjahr() == true)
					tage = tage + 1;
			case 2:
				tage = tage + 31;
			case 1:
				break;
			default:
				return -1;
		}
		tage = tage + tag - 1;
		long stunden = (tage * 24) + stunde;
		long minuten = (stunden * 60) + minute;
		long sekunden = (minuten * 60) + sekunde;
		return sekunden;
	}

	public final long getTimestampDayStart()
	{
		long stamp;
		stamp = jahr;
		stamp = stamp * 100;
		stamp = stamp + monat;
		stamp = stamp * 100;
		stamp = stamp + tag;
		stamp = stamp * 1000000;
		return stamp;
	}

	public final long getTimestampDayEnd()
	{
		long stamp;
		stamp = jahr;
		stamp = stamp * 100;
		stamp = stamp + monat;
		stamp = stamp * 100;
		stamp = stamp + tag;
		stamp = stamp * 100;
		stamp = stamp + 23;
		stamp = stamp * 100;
		stamp = stamp + 59;
		stamp = stamp * 100;
		stamp = stamp + 59;
		return stamp;
	}

	private final void addTag()
	{
		tag = tag + 1;
		int max = 0;
		switch(monat)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				max = 31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				max = 30;
				break;
			case 2:
				if(this.istSchaltjahr() == true)
					max = 29;
				else
					max = 28;
				break;
			default:
				break;
		}
		if(tag > max)
		{
			tag = 1;
			monat = monat + 1;
		}
		else
			return;
		if(monat > 12)
		{
			monat = 1;
			jahr = jahr + 1;
		}
	}

	private final void subTag()
	{
		tag = tag - 1;
		if(tag == 0)
			monat = monat -1;
		else
			return;
		if(monat == 0)
		{
			monat = 12;
			jahr = jahr - 1;
		}
		switch(monat)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				tag = 31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				tag = 30;
				break;
			case 2:
				if(this.istSchaltjahr() == true)
					tag = 29;
				else
					tag = 28;
				break;
			default:
				break;
		}
	}

	public final void addSekunden(int seconds)
	{
		sekunde = sekunde + seconds;
		int korrektur = 0;
		while(sekunde > 59)
		{
			sekunde = sekunde - 60;
			korrektur = korrektur + 1;
		}
		while(sekunde < 0)
		{
			sekunde = sekunde + 60;
			korrektur = korrektur - 1;
		}
		if(korrektur == 0)
			return;
		minute = minute + korrektur;
		korrektur = 0;
		while(minute > 59)
		{
			minute = minute - 60;
			korrektur = korrektur + 1;
		}
		while(minute < 0)
		{
			minute = minute + 60;
			korrektur = korrektur - 1;
		}
		if(korrektur == 0)
			return;
		stunde = stunde + korrektur;
		korrektur = 0;
		while(stunde > 23)
		{
			stunde = stunde - 24;
			korrektur = korrektur + 1;
		}
		while(stunde < 0)
		{
			stunde = stunde + 24;
			korrektur = korrektur - 1;
		}
		if(korrektur == 0)
			return;
		while(korrektur > 0)
		{
			addTag();
			korrektur = korrektur - 1;
		}
		while(korrektur < 0)
		{
			subTag();
			korrektur = korrektur + 1;
		}
		check();
	}
}
```


----------



## Landei (7. Apr 2010)

Oder gleich JODA-Time nehmen (Java 7 wird wohl etwas ähnliches enthalten, wenn es rechtzeitig fertig wird).


----------



## ballibum (8. Apr 2010)

hi, leider klappt das Alles vorne und hinten nicht. Beim Einlesen wandelt mir Java das Datum schon in ein obstruses Datum um. Ich finde leider keine echte Erklärung dafür.
Hier ist mal mein Javacode:


```
public static void datum(Object x, Object y)
	 {
		 Date a = null,b = null;
		 String x1 = x.toString();
		 String y1 = y.toString();
		 SimpleDateFormat x2 =new SimpleDateFormat("yyyymmdd");
		 SimpleDateFormat y2 =new SimpleDateFormat("yyyymmdd");
		 try
		 {
			  a = x2.parse(x1);
			  b = y2.parse(y1);	 
		 }
		 catch (ParseException ex2)
		 { 
		 }
		 
		 System.out.println(y1+" "+b);
		 
	}
```


Beim Outprint kommt dann soetwas heraus:20090331 Sat Jan 31 00:03:00 CET 2009, dabei wäre 20090331 das Datum, welches er ausgeben sollte.

Was muss ich ändern damit java mein Datum richtig einliest?

vielen Dank für eure Mühen
Ballibum


----------



## ballibum (8. Apr 2010)

Ich denke ich werde doch die Variante mit dem Gregorianischem Kalender machen und vorher mein String umwandeln, eventuell doch einwenig einfacher.

ansonsten muss ich bei der Formatierungseingabe yyyyMMDD schreiben, damit nullen als auftakt berücksichtigt werden


```
public static void datum(Object x, Object y)
	 {
		String x1 = x.toString();
		String y1 = y.toString();
		int a1 = Integer.parseInt(x1.substring(0,4));
		int b1 = Integer.parseInt(x1.substring(4,6));
		int c1 = Integer.parseInt(x1.substring(6,8));
		int a2 = Integer.parseInt(y1.substring(0,4));
		int b2 = Integer.parseInt(y1.substring(4,6));
		int c2 = Integer.parseInt(y1.substring(6,8));
		GregorianCalendar currentTime = new GregorianCalendar(a1,b1,c1);
		GregorianCalendar pastTime = new GregorianCalendar(a2,b2,c2);
		long difference = currentTime.getTimeInMillis() - pastTime.getTimeInMillis();
		int days = (int)(difference / (1000 * 60 * 60 * 24));
		System.out.println(days);
	}
```


----------



## Jens81 (8. Apr 2010)

Groß- und Kleinschreibung musst du bei der Formatierung berücksichtigen:


```
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); // Jahr Monat Tag Stunde Minute Sekunde
```


----------

