[GastForen Programmierung/Entwicklung JavaScript alter berechnen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

alter berechnen

nika15
Beiträge gesamt: 69

16. Aug 2004, 19:14
Beitrag # 1 von 8
Bewertung:
(10243 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
wer kann mir mein script korrigieren ?finde die/den fehler nicht!




<html>

<head>
<title></title>

<script type="text/javascript">
<!--

function berechnung()
{
if (jahr == 0 || jahr == isNaN || jahr.length < 4 || monat == 0 || monat == isNaN || tag == 0 || tag == isNaN)
alert("Diese Eingabe ist nicht korrekt!");
// wie funktion abbrechen ?? mit break; geht dann gar nichts mehr??

var geburtsdatum = document.g_datum.geburtstag.value;
var punkt1 = geburtsdatum.indexOf(".");
var punkt2 = geburtsdatum.indexOf(".", punkt1 + 1);
var tag = geburtsdatum.substr(0, punkt1);
var monat = geburtsdatum.substr(punkt1 + 1, punkt2 - (punkt1 + 1));
var jahr = geburtsdatum.substr(punkt1 + 1, punkt2 + 1, - (punkt1 + 1 - punkt2)); //???

var geburtstag = new Date(jahr,monat - 1, tag);
var heute = new Date();
var alter = heute.getFullYear() - geburtstag.getFullYear();

// wenn der monat noch nicht erreicht ist => 1 jahr abziehen
if (heute.getMonth() < geburtstag.getMonth())
alter = alter - 1;
else { // richtiger monat aber der tag ist noch nicht erreicht => 1 Jahr abziehen


if (heute.getMonth() == geburtstag.getMonth() &&
heute.getDate() < geburtstag.getDate())
alter = alter - 1;
}

alert("Sie sind" +Math.ceil(alter)+ "Jahre alt!");
}




// -->
</script>

</head>
<body>
<br><br><br>
<table border="0" width="100%">
<tr><td>

<form name="g_datum">
<table border="0" align="center" cellpadding="8">
<tr height="30">
<td> Geburtsdatum: </td>
<td><input type="text" name="geburtstag" size=10"> (Tag.Monat.Jahr)</td></tr>
<td colspan=2><br><input type="button" name="rechnen" value="Alter anzeigen" onClick="berechnung();"></td>
</tr>
</table>
</form>


</td></tr>
</table>
<br><br><br>
<noscript>Ihr Browser versteht leider kein JavaScript! </noscript>

</body>
</html>

(Dieser Beitrag wurde von nika15 am 10. Nov 2004, 23:08 geändert)
X

alter berechnen

Markus Walker
Beiträge gesamt: 494

17. Aug 2004, 12:36
Beitrag # 2 von 8
Beitrag ID: #103520
Bewertung:
(10242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo nika15

Um bei einer Überprüfung das eine oder das andere zu tun, je nach Ergebnis der Prüfung, kann man das if/else Kontrol-Statement benutzen. Bei mehreren Varianten bietet sich das switch/case Statement an.

Die Überprüfung der Eingabe kann am elegantesten mit einer Regular Expresion überprüft werden, da die Datums-Eingabe numerisch erfolgen muss. Gemäss Aufgabenstellung ergibt dies folgende RegExp:
/(\d{1,2}\.){2}\d{4}/

In deutsch heisst dies:
(\d{1,2}\.) eine oder zwei Ziffern gefolgt von einem Punkt
{2} zwei mal (Tage und Monate haben die selbe Formatierung!)
\d{4} gefolgt von vier Ziffern

Bei der Auswertung des Strings aus der Eingabe kann mittels der Methode split() ein Array erzeugt werden. Dies eignet sich herforragend für weitere Auswertungen und Berechnungen.

Daraus ergibt sich folgende Funktion:

function berechnung() {
var datumsFormat = /(\d{1,2}\.){2}\d{4}/;
var heute = new Date();

if (datumsFormat.test(document.g_datum.geburtstag.value)) {
var geburtsdatum = document.g_datum.geburtstag.value.split(".") //array mit 3 Elementen [Tag,Monat,Jahr]
var alter = heute.getFullYear() - geburtsdatum[2];
if (heute.getMonth() == geburtsdatum[1] && heute.getDate() < geburtsdatum[1] || heute.getMonth() < geburtsdatum[1]) alter--; //Korrektur, wenn Geburtstag noch nicht erreicht
window.alert(alter);
} //if
else alert("Diese Eingabe ist nicht korrekt!");
}//function berechnung()



Wenn eher ein Zeitraum gesucht wird, kann man mit Date-Objekten Rechnen. Für die gestellt Aufgabe ergäbe dies in wenigen Fällen eine Abweichung von einem Jahr (wegen Schaltjahren).

geburtsdatum[1]--; //Monat muss für das Date-Objekt 0-basierend gezählt werden
geburtsdatum = new Date(geburtsdatum[2],geburtsdatum[1],geburtsdatum[0]); //konvertieren in Date-Objekt
var alter = heute - geburtsdatum; //alter in ms
window.alert(math.floor(alter/(365.25*24*60*60*1000))); //Ein durchschnittliches Jahr hat 365.25 Tage, 24 Stunden pro Tag, 60 Minuten pro Stunde, 60 Sekunden pro Minute und 1000 Millisekunden pro Sekunde. Das Date-Objekt wird in Millisekunden verwaltet.


HTH


als Antwort auf: [#103360]
(Dieser Beitrag wurde von Markus Walker am 17. Aug 2004, 12:43 geändert)

alter berechnen

Anonym
Beiträge gesamt: 22827

17. Aug 2004, 12:47
Beitrag # 3 von 8
Beitrag ID: #103525
Bewertung:
(10242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Anmerkung:

dieser Ausdruck wird vom IE5 nicht unterstützt.
/(\d{1,2}\.){2}\d{4}/

besser ist hier

/^(\d\d)\.(\d\d)\.(\d\d\d\d)$/

oesi

[Edited: \ Backslashes eingefügt, diese müssen doppelt eingegeben werden, da das Forum den ersten frisst... -- Markus]


als Antwort auf: [#103360]
(Dieser Beitrag wurde von Markus Walker am 17. Aug 2004, 18:09 geändert)

alter berechnen

oesi50
  
Beiträge gesamt: 2315

17. Aug 2004, 12:56
Beitrag # 4 von 8
Beitrag ID: #103529
Bewertung:
(10242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
das kann man hier nachprüfen
http://vsrv.de/examples/regex3.html

Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)


als Antwort auf: [#103360]
(Dieser Beitrag wurde von oesi50 am 17. Aug 2004, 13:12 geändert)

alter berechnen

Markus Walker
Beiträge gesamt: 494

17. Aug 2004, 18:30
Beitrag # 5 von 8
Beitrag ID: #103611
Bewertung:
(10242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
@oesi: Ich konnte Deine Bemerkung betreffs IE5 nicht verifizieren. Die obige RegExp lief bei mit mit IE 5.00 auf Win98SE und WinNT einwandfrei. Kannst Du Näheres dazu berichten?

Zur Erklärung der RegExp von Oesi:
^ Anfang des Strings
(\d\d) gefolgt von zwei Ziffern
\. gefolgt von einem Punkt
(\d\d) gefolgt von nochmals zwei Ziffern
\. gefolgt von einem Punkt
(\d\d\d\d) gefolgt von vier Ziffern
$ gefolgt vom Ende des Strings

Der Unterschied ist, dass der Anfang und das Ende und somit die Stringlänge auch festgelegt wird. Der Rest ist gleich, einfach anderst formuliert ;-). Aber bei RegExp muss man manchmal anderst formulieren, da sie in der Tat manchmal nicht vollständig implementiert sind.


Trotzdem haben sich zwei Fehler eingeschlichen, welche sich beim nachträglichen Testen bemerkbar machten. So fehlte in der ersten Variante der Auswertung folgende Zeile:

geburtsdatum[1]--; //Monat muss für das Date-Objekt 0-basierend gezählt werden

Und beim if Statement habe ich etwas schnell kopiert. So muss die Funktion wiefolgt aussehen:

function berechnung() {
var datumsFormat = /(\d{1,2}\.){2}\d{4}/;
var heute = new Date();

if (datumsFormat.test(document.g_datum.geburtstag.value)) {
var geburtsdatum = document.g_datum.geburtstag.value.split(".") //array mit 3 Elementen [Tag,Monat,Jahr]
geburtsdatum[1]--; //Monat muss für das Date-Objekt 0-basierend gezählt werden
var alter = heute.getFullYear() - geburtsdatum[2];
if (heute.getMonth() == geburtsdatum[1] && heute.getDate() < geburtsdatum[0] || heute.getMonth() < geburtsdatum[1]) alter--; //Korrektur, wenn Geburtstag noch nicht erreicht
window.alert(alter);
} //if
else alert("Diese Eingabe ist nicht korrekt!");
}//function berechnung()


HTH


als Antwort auf: [#103360]

alter berechnen

oesi50
  
Beiträge gesamt: 2315

17. Aug 2004, 18:51
Beitrag # 6 von 8
Beitrag ID: #103615
Bewertung:
(10242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
@markus

Ich habe zum Testen einen IE5.00.3505.1000, mit dem geht d{1,2} und d+? nicht. Möglicherweise existieren hier unterschiedliche Versionen.
Und da ich immer darauf achte, alles, soweit wie möglich, abwärtskompatibel zu machen, verzichte ich halt darauf.

Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)


als Antwort auf: [#103360]
(Dieser Beitrag wurde von oesi50 am 17. Aug 2004, 18:54 geändert)

alter berechnen

Markus Walker
Beiträge gesamt: 494

17. Aug 2004, 19:19
Beitrag # 7 von 8
Beitrag ID: #103621
Bewertung:
(10242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
@oesi: Ja, da sieht man es wieder mal, die feinen Unterschiede... Ich testete mit IE 5.00.2919.6307. Keine Ahnung, ob diese Version nun jünger oder älter ist als Deine.


als Antwort auf: [#103360]

alter berechnen

Anonym
Beiträge gesamt: 22827

17. Aug 2004, 21:30
Beitrag # 8 von 8
Beitrag ID: #103632
Bewertung:
(10242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
herzlichen dank :-)))

nika


als Antwort auf: [#103360]
X