/***** Geburtstagsdaten mit Java aus einer Datei lesen und zeitnahe Termine anzeigen.
* Bsp.: Welche Termine liegen ein paar Tage vor dem aktuellen Datum und
* welche Termine liegen ein paar Tage nach dem aktuellen Datum?
* Die Anzahl der Tage für Rückblick und Vorausschau sind getrennt einstellbar.
*
* Die Datei muss so aufgebaut sein, dass die Termine zeilich aufeinander folgen, also
* 01.01.0000, Neujahr
* 02.01.1900, Geburtstag Oma
* ...
* 30.12.1900, Geburtstag Opa,
* 31.12.0000, Silvester
*
* Hinweis: Wird die Geburtstagsdatei nur einmal durchlaufen, dann bekommt man zeitnahe Termine
* aus dem Vorjahr oder aus dem Folgejahr nicht mit.
* Bsp.: Das aktuelle Datum ist der 01.01., ein Termin am 31.12. würde bei einmaligem Durchlaufen
* der Geburtstagsdatei nicht erkannt werden.
*
* Deshalb sind 3 Situationen zu beachten:
* 1.) Ist der Rückblickwert so gross, dass das Vorjahr beachtet werden muss?
* 2.) Das normale Abarbeiten der Geburtstagsdatei
* 3.) Ist der Vorausschauwert so gross, dass das Folgejahr beachtet werden muss?
*
* Zu 1.)
* letzterTermin aktuellerTermin nächsterTermin
* 31.12. 01.01. 05.01.
* tageRueck tageVor
*
* Wenn tageRueck so groß ist, dass vom aktuellen Termin rückwärts ein Vorjahrestermin
* getroffen werden kann, müssen die Geburtstagsdaten 2 mal durchlaufen werden.
*
* Zu 2.) Die Termine müssen nur einmal durchsucht werden
*
* Zu 3.) tageVor kann so gross sein, dass vom aktuellen Termin vorwärts ein Termin
* des nächsten Jahres getroffen werden kann. Auch hier müßte die Datei 2 mal durchlaufen
* werden.
*
* Fazit:
* Die Termine aus der Datei müssen eventuell 2 mal verarbeitet werden.
* Deshalb bietet es sich an die Termine/Daten im Speicher zu halten mit z.B. einem Vektor.
*
* Logik:
* - Wenn (aktTermin-tageRueck < 01.01.) dann Vorjahr berücksichtigen
* - Wenn (aktTermin-tageRueck >= 01.01.) dann kein Vorjahr berücksichtigen
* - Wenn (aktTermin+tageVor > 31.12.) dann Folgejahr berücksichtigen
* - Wenn (aktTermin+tageVor <= 31.12.) dann kein Folgejahr berücksichtigen
*/
import java.io.*;
import java.util.*;
public class GebTag {
public static void main(String[] args) {
GregorianCalendar cal = new GregorianCalendar();
final int aktTT = cal.get(Calendar.DATE);
final int aktMM = cal.get(Calendar.MONTH)+1;
final int aktJJJJ = cal.get(Calendar.YEAR);
final int tageRueck = 7;
final int tageVor = 21;
File file = new File("d:/testgebtag/gebtag.txt");
Vector vGebdat = new Vector();
if (file.exists() && !file.isDirectory()) {
try {
BufferedReader einDatei = new BufferedReader(new FileReader(file)); // Reader nutzen
String einZeile = "";
while ((einZeile = einDatei.readLine()) != null) {
vGebdat.addElement(einZeile); // Zeile als Object in Vektor schreiben
}
einDatei.close();
}
catch (IOException e) {
System.out.println("Fehler: "+e.toString());
}
}
// Wenn Anzahl Tage vom Jahresanfang bis zum aktuellen Datum kleiner als tageRueckblick,
// dann erstmal das Vorjahr bearbeiten
if (berechneDiffTage(01,01,aktJJJJ,aktTT,aktMM,aktJJJJ)-tageRueck<0) {
verarbeiteDaten(vGebdat, tageRueck, tageVor, aktTT, aktMM, aktJJJJ, aktJJJJ-1);
}
// normaler Durchlauf der Daten
verarbeiteDaten(vGebdat, tageRueck, tageVor, aktTT, aktMM, aktJJJJ, aktJJJJ);
// Wenn Anzahl Tage vom aktuellen Datum bis zum Jahresende kleiner als tageVorschau,
// dann zusätzlich das Folgejahr bearbeiten
if (berechneDiffTage(aktTT,aktMM,aktJJJJ,31,12,aktJJJJ)-tageVor<0) {
verarbeiteDaten(vGebdat, tageRueck, tageVor, aktTT, aktMM, aktJJJJ, aktJJJJ+1);
}
}
/* Vektordaten abarbeiten */
private static void verarbeiteDaten(Vector v, int tageRueck, int tageVor,
int aktTT, int aktMM, int aktJJJJ, int JJJJ) {
String vString="";
StringTokenizer sT;
String datum="", anlass="", zeigeAlter;
int datumTT=0, datumMM=0, datumJJJJ=0, diffRueck=0, diffVor=0, alter;
for (Enumeration elem=v.elements(); elem.hasMoreElements(); ) {
vString=(String)elem.nextElement();
sT = new StringTokenizer(vString,",");
int tokenCount=0;
while (sT.hasMoreTokens()) {
tokenCount++;
if (tokenCount==1)
datum = sT.nextToken().trim();
else
anlass = sT.nextToken().trim();
}
try { // bei einem ungueltigen Datum den ganzen Satz missachten und nicht anzeigen
datumTT=Integer.valueOf(datum.substring(0,2)).intValue();
datumMM=Integer.valueOf(datum.substring(3,5)).intValue();
datumJJJJ=Integer.valueOf(datum.substring(6,10)).intValue();
diffRueck=berechneDiffTage(datumTT,datumMM,JJJJ,aktTT,aktMM,aktJJJJ);
diffVor =berechneDiffTage(aktTT,aktMM,aktJJJJ,datumTT,datumMM,JJJJ);
alter=0;
zeigeAlter="";
if (datumJJJJ>0) {
alter=aktJJJJ-datumJJJJ;
zeigeAlter=alter+".";
}
if (diffRueck<=tageRueck && diffRueck>0) { // Termine vor dem aktuellen Datum
System.out.println(datum+" "+zeigeAlter+anlass);
}
if (diffRueck==0) { // Termin = aktuelles Datum = Heute
System.out.println(datum+" "+zeigeAlter+anlass+" HEUTE!!!");
}
if (diffVor<=tageVor && diffVor>0) { // Termine nach dem aktuellen Datum
System.out.println(datum+" "+zeigeAlter+anlass);
}
}
catch (Exception e){
System.out.println("Fehler: "+e.toString());
}
}
}
/* Anzahl Tage zwischen zwei Datumswerten berechnen */
public static int berechneDiffTage(int vonTT, int vonMM, int vonJJJJ,
int bisTT, int bisMM, int bisJJJJ) {
Calendar cal_1 = new GregorianCalendar();
Calendar cal_2 = new GregorianCalendar();
long time=0;
int diffTage=0;
cal_1.set(vonJJJJ, vonMM, vonTT); // erster Zeitpunkt
cal_2.set(bisJJJJ, bisMM, bisTT); // zweiter Zeitpunkt
time = cal_2.getTime().getTime() - cal_1.getTime().getTime(); // Differenz in ms
diffTage = (int) Math.round( (long)time / (24. * 60.*60.*1000.) ); // Differenz in Tagen
return diffTage;
}
}