Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich möchte derzeit ein Programm schreiben, dass nach der Eingabe von zwei Datumsangaben die Zeitdifferenz in Tagen ausrechnet.
Die Eingabe funktioniert problemlos, wenn ich aber dann den String (z.B. 01.01.2012) mit .split(".") trennen will und in einen String-Array einfügen will, funktionierts nicht recht.
Java:
public void calcDiff(String d1, String d2) //hier werden zwei Strings im Format (dd.mm.yyyy) übergeben
{
Calendar ca = Calendar.getInstance();
Calendar cb = Calendar.getInstance();
String[] dateone = d1.split("."); //Hier sitzt wohl der Fehler, nur komm ich nicht drauf...
System.out.println(dateone.length); //gibt 0 aus
int[] date1 = new int[3];
String[] datetwo = d2.split(".");
int[] date2 = new int[3];
for(int i=0; i<=2; i++)
{
date1[i]=Integer.parseInt(dateone[i]);
}
for(int i=0; i<=2; i++)
{
date2[i]=Integer.parseInt(datetwo[i]);
}
ca.set(date1[2], date1[1], date1[0]);
cb.set(date2[2], date2[1], date2[0]);
long dat1 = ca.getTimeInMillis();
long dat2 = cb.getTimeInMillis();
long diff = dat2-dat1;
Zusatzfrage: Gibt es keinen effizienteren Weg, so eine Datumsdifferenz auszurechnen, die Version hier kommt mir zu klumpig vor
split erwartet als Parameter einen Regex. Der Punkt in regular expressions für ein beliebiges Zeichen, also ist dateone leer. Du müsstest den Punkt escapen (\\.), dann wird richtig gesplittet.
Allerdings geht das alles mit dem SimpleDateFormat wesentlich einfacher. Mit dessen parse Methode kannst du aus nem String nen Date machen.
hier musst du mit dem Index einen String ansprechen und nicht allgemein.
Es gibt eine: JCalendar Java Bean, a Java Date Chooser mit der habe ich selbst schon mal gearbeitet und hat auch gut funktioniert. Kannst es dir ja mal anschauen. Ansonsten könnte ich später noch ein Beispiel posten, hab grad aber keine Zeit mehr.
Danke für die Antworten, werde mich erstmal in das SimpleDateFormat einlesen.
EDIT: Hab in der API von SDF bissher nur eine Methode gefunden, um den String in ein Date zu parsen, aber jedoch nicht in einen Calendar.
Mein bissheriger Code:
Java:
Calendar ca = Calendar.getInstance();
Calendar cb = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
// Wie bekomm ich so den String in den Calendar?
EDIT2: Hab rausgefunden, dass ich den Wert von Date in den Calendar einfügen kann. Jetzt muss ich aber keine Execption abfangen, hab aber noch nie mit denen zu tun gehabt. Kann ich das irgendwie umgehen?
neuer Code:
Java:
Calendar ca = Calendar.getInstance();
Calendar cb = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
Date eins = format.parse(d1);
ca.setTime(eins);
Date zwei = format.parse(d2);
cb.setTime(zwei);
Hm... denk, da würde mich der Lehrer wohl ein bisschen schräg anschauen, wenn ich im Stoff so vorgreif.
Denk, ich schau mir mal das mit dem try-catch Block an.
Mein Lehrer hatte sich gefreut. Endlich jemand der Java Programmierung mag und auch durchsteigt. Denke das wird bei dir ähnlich sein. Ein Lehrer freut sich, wenn jemand an seinem Fachgebiet interessiert ist.
public void calcDiff(String d1, String d2)
{
Calendar ca = Calendar.getInstance();
Calendar cb = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
Date eins = new Date();
Date zwei = new Date();
try
{
eins = format.parse(d1);
}
catch (ParseException e)
{
e.printStackTrace();
}
ca.setTime(eins);
try
{
zwei = format.parse(d2);
}
catch (ParseException e)
{
e.printStackTrace();
}
cb.setTime(zwei);
long diff = cb.getTimeInMillis()-ca.getTimeInMillis();
System.out.println("Die Differenz beträgt "+(diff/1000/60/60/24)+" Tage.");
}
Bei d1=01.01.2012, d2=01.01.2013 kommt am Ende 366 raus. (Schaltjahr?)
Danke nochmal euch
EDIT: wenn man die Berechnung im letzten System.out.println(); auf (int) castet, stimmt das Ergebnis!
Kannst es dir zur Sicherheit auch nochmal ausrechnen
Ein Jahr ist Schaltjahr, wenn es durch 4 teilbar ist.
Ist es aber auch durch 100 teilbar, dann gilt Regel 1 nicht, und es ist kein Schaltjahr.
Ist es aber auch durch 400 teilbar, dann gilt Regel 2 nicht, und es ist doch ein Schaltjahr.
Also schummel ich, wenn ich mit (int) etwas wegschneide.
Mal sehen, ob ich das jetzt noch hinkrieg...
Danke für die Hilfe wieder !
EDIT: Habe gelogen Funktioniert doch einwandfrei!
Und mit meinem neu erworbenem Wissen über Try-Catch hab ich gleich das ganze Programm gegen falsche Eingaben schützen können...
Es wird halt nun darauf hingewiesen, dass eine Exception fallen könnte.
Allerdings behandelst du diese nicht, wenn ein User etwas falsch macht, dann kommt lediglich ein Fehler. Du könntest zum Beispiel bei einer Exception eine Notiz an den Anwender ausgeben. Oder eine Textdatei mit allen aufgetretenen Fehlern erstellen lassen/ bzw. dann erweitern.
Wenn der Benutzer eine falsche Angabe macht, setz ich im Catch-Block eine Error-Variable auf 1, weiß den Nutzer auf seine Fehleingabe hin und hau ihn dann bei der nächsten If-Verzweigung raus.
Find ich eleganter wie den dreizeiligen Fehler, den Java anzeigt... nicht jeder Benuter von dem Programm kann Englisch .