Link zu www.kneller-gifs.de

Datei lesen/schreiben Geburtstagstermine

/***** 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;
    }
  }