Geburtstagreminder

Domsi

Erfahrenes Mitglied
So hab ne Frage.

Hab einen Geburtstagreminder mit xml gebaut. Passt funktioniert das Laden aus der xml, nur jetzt wollte ich das alle Geburtstage 10 tage vor dem Geburtstag angezeigt werden und der Rest nicht.

Daweil hab ich es so, das nur Geburtstage in diesem Monat und in der Zukunft angzeigt werden, also alle im September die nach dem heutigem Datum liegen.

Nur wie geht das mit dem Monatswechsel? Das ist mein Problem.

Hier der Flash und XML Code:
PHP:
reminder = new XML();
reminder.ignoreWhite = true;
reminder.load("reminder.xml");
//
reminder.onLoad = function(laden){
        if(laden){
                geburtstag();
        }else{
                trace("Fehler beim laden der Xml-Datei")
        }
}

function geburtstag(){
        //Erstellt die arrays für die Daten
        reminder_vorname = [];
        reminder_nachname = [];
        reminder_tag = [];
        reminder_monat = [];
        reminder_jahr = [];
        //
        for(var i=0; i<reminder.firstChild.childNodes.length; i++){
                reminder_vorname[i] = reminder.firstChild.childNodes[i].attributes.vorname;
                reminder_nachname[i] = reminder.firstChild.childNodes[i].attributes.nachname;
                reminder_tag[i] = reminder.firstChild.childNodes[i].attributes.tag;
                reminder_monat[i] = reminder.firstChild.childNodes[i].attributes.monat;
                reminder_jahr[i] = reminder.firstChild.childNodes[i].attributes.jahr;
                //
                //Alle berechnungen und was dafür notwendig ist
                var dieses_datum = new Date();
                var heuriges_jahr = dieses_datum.getFullYear();
                var dieses_monat = dieses_datum.getMonth()+1;
                var dieser_tag = dieses_datum.getDate();
                //
                var alter = heuriges_jahr-reminder_jahr[i];
                
                //Ausgabe im Textfeld
                //<<<<<<<<<<<<<<<<<<<<<<<<<Hier ist der Teil mit der Anzeige, wo mein wunsch mit den 10 tagen hinkommt
                if(reminder_monat[i] == dieses_monat && reminder_tag[i]>=dieser_tag){//Geburtstage die in diesem Monat sind und nach dem heutigem Datum sind, werden angezeigt.
                        ausgabe.htmlText += reminder_vorname[i]+" "+reminder_nachname[i]+" hat am "+reminder_tag[i]+"."+reminder_monat[i]+" Geburtstag und wird "+alter+"<br>";
                }
        }
}

und XML:
Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<daten>
	<reminder_info vorname="Dominik" nachname="Klein" tag="29" monat="09" jahr="1989"/>
	<reminder_info vorname="Hannes" nachname="Klein" tag="10" monat="12" jahr="1954"/>
	<reminder_info vorname="Evelyn" nachname="Klein" tag="13" monat="09" jahr="1964"/>
	<reminder_info vorname="Daniel" nachname="Klein" tag="1" monat="09" jahr="1993"/>
</daten>

Danke für die Hilfe
 
Zuletzt bearbeitet:
Hi,

halbwegs genau sollte es so gehen:
PHP:
var xm = new XML();
xm.ignoreWhite = true;
xm.onLoad = function() {
	parse(this);
}
xm.load("geburtstag.xml");

var entry = new Array();

function parse(obj) {
	var nodes = obj.firstChild.childNodes;
	for (var i=0; i<nodes.length; i++) {
		var node = nodes[i];
		entry[i] = new Object();
		entry[i].vname = node.attributes.vorname;
		entry[i].nname = node.attributes.nachname;
		entry[i].tag = node.attributes.tag;
		entry[i].monat = node.attributes.monat;
		entry[i].jahr = node.attributes.jahr;
	}
	showThem();
}

function showThem() {
	var now = new Date();
	for (var i=0; i<entry.length; i++) {
		var jahr = now.getYear() + 1900;
		var monat = parseInt(entry[i].monat, 10) - 1;
		var tag = parseInt(entry[i].tag, 10);
		var stunde = now.getHours();
		var minute = now.getMinutes();
		var sekunde = now.getSeconds();
		var milli = now.getMilliseconds();
		var then = new Date(jahr, monat, tag, stunde, minute, sekunde, milli);
		var dist = then - now;
		if (dist >= 0 && dist <= 864000000) {
			trace(entry[i].vname + " " + entry[i].nname + " hat am");
			trace(entry[i].tag + "." + entry[i].monat + " Geburtstag!");
		}
	}
}
Dabei ist natürlich die Uhrzeit nicht berücksichtigt, aber die hast Du ja auch nicht angegeben. ;)

Gruß
.
 
ne stimmt hab ich ja auch nicht.

Aber frage, muss ich mich ja jetzt auskennen auch noch :)

naja mal schaun, vielleicht kapiers ichs ja, glaubs zwar nicht :(
 
Hi,

so kompliziert ist das gar nicht: Du erstellst im Prinzip zwei Date-Objekte, eins mit dem aktuellen Datum und der Uhrzeit und eins mit Monat und Tag des Geburtstagskindes (Stunden, Minuten usw. werden auf die Werte des heutigen Datums gesetzt). Dann vergleichst Du den Zahlwert beider Date-Objekte (Variable "dist"). 10 Tage sind nunmal 864000000 Milisekunden und Du zeigst alle Geburtstage an, deren Abstand zu heute größer oder gleich 0 ist (hat heute Geburtstag) und kleiner oder gleich 864000000 (heute in 10 Tagen).

Gruß
.
 
gut, danke ich werds später nochmal durchschauen, erst ma zur Freundin.

Wenn ichs dann noch immer nicht kapier, schreib ichs.

Danke
 
Hi,

so hab doch fast alles verstanden nur noch kleine sachen:

was macht das parseInt()?

und wieso braucht man die Sekunden und Stunden und Minuten, wenn sie ja gar nicht beim benötigt werden, oder sind es sonst keine 10 tage?

So, das waren dann vorerst mal alles, aber ich weiß nicht obs dann noch irgendwo hängen wird.

Danke für deine Hilfe
 
Hi,

1. parseInt wandelt einen String in eine Integer-Zahl um (das hätte Dir die Flash-Referenz auch sagen könnnen ;) ).

2. Jetzt tut er so, als ob die Geburtsstunde exakt die selbe wäre wie die aktuelle Urzeit. Daher kann es zu Ungenauigkeiten kommen. Du kannst alternativ Mitternacht angeben (stunde, minute, sekunde, milli auf 0 setzen) - so wird es ja auch meist gehandhabt. Wenn Du die genaue Uhrzeit mit verwenden willst (von heute, 18:30 bis Morgen 12:10 ist es ja rechnerisch weniger als ein Tag), kannst Du sie natürlich auch in der XML-Datei angeben.

Gruß
.
 
ok, danke

ich hab noch etwas gemacht, da eine woche ja 864000000 Millisekunden hat, muss 1 tag 86400000 Millisekunden haben.
Daher brauch ich ja nur die Differenz der Millisekunden durch die Millisekunden eines Tages rechnen und man hat die Tage bis zum Geburtstag.

PHP:
var dif_tage = dist/86400000

falls das jemand noch brauchen sollte.

aber eins ist mit noch aufgefallen, es sieht doch unmöglich aus, wenn da steht das ich in 15 Tagen Geburtstag habe und meine Mutter heute.

Das ist einfach schrecklich so, wie kann man das sotieren? Ich weiß einfach nicht wie man das macht?
 
Hi,

sortier Dir das Array "entry" einfach nach dem Datum:
PHP:
// Vor der Ausgabe, also am besten am Anfang
// der Funktion "showThem":
entry.sort(byDate);
Dazu machst Du Dir eine entsprechende Vergleichsfunktion (vgl. Array.sort()):
PHP:
function byDate(o1, o2) {
	var now = new Date();
	var d1 = new Date(now.getYear() + 1900, parseInt(o1.monat, 10) - 1, parseInt(o1.tag, 10), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
	var d2 = new Date(now.getYear() + 1900, parseInt(o2.monat, 10) - 1, parseInt(o2.tag, 10), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
	return ((d1 < d2)? -1 : 1);
}

Gruß
.
 
Sorry, aber so ganz hab ich das nicht verstanden :confused:

Ich hab auch mal die Flash-hilfe benutzt aber ich werder daraus einfach nicht schlau. Ich hab nun vor die Funktion showThem(), den Code gesetzt, aber die Funktiont byDate wird da schon gar nicht ausgeführt.

Und warum d1 und d2, und als parameter o1,o2? Ich nehm an du hast es anhand meines Beispieles genommen, aber wenn jetzt 5 Leute in der Liste stehen werden ja auch nur 2 aussortiert!
Da müsste ich ja immer schauen wie viel in diesem Zeitraum sind und per hand eintragen! Ich will das aber alles Voll Automatisch haben.

Ich weiß jetzt wirklich nicht so ganz was und wie das geht.
 

Neue Beiträge

Zurück