Stefan: Auf den Tag genau das Alter herausfinden

Mit bezug auf das gleichnamige (oben verlinkte) Topic eine kleine Frage / Anmerkung...

Bei mir wird keineswegs die richtige Differenz angezeigt... vielmehr rechnet das ganze mit einer Art Durchschnitt (wie bei Banken).
Der Monat hat 30 Tage und Schaltjahre gibts nicht.
Nach längerer Suche habe ich allerdings keine Lösung gefunden bzw. nur EINEN Hinweis auf das "Problem" entdeckt. Bin ich einfach nur doof? Oder ist es hinreichend bekannt, dass im Prinzip vollkommen falsche "Ergebnisse" auftreten!?

Im folgenden Beispiel wird zwischen dem 26.02.2006 und dem 05.03.2006 eine Differenz von 10 (!!) Tagen angegeben. Das sind 3 oder 2 Tage (je nach Zählart :P ) zuviel.

Weiß jemand ne Lösung?

getestete Browser: FF 1.0 - 2.0, IE 5-6, Opera 9.0, Netscape 7.1

  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
<head>  
  <title>Hello!</title>  
 <script language="JavaScript" type="text/javascript">  
 <!--  
   zeit1 = new Date(2006, 02, 26);  
   zeit2 = new Date(2006, 03, 05);  
  
   diff = Math.round((zeit2.getTime() - zeit1.getTime()) / (1000 * 60 * 60 * 24));  
   alert(diff);  
 -->  
 </script>  
</head>  
<body>  
</body>  
</html>  

  1. hi,

    Im folgenden Beispiel wird zwischen dem 26.02.2006 und dem 05.03.2006 eine Differenz von 10 (!!) Tagen angegeben. Das sind 3 oder 2 Tage (je nach Zählart :P ) zuviel.

    Weiß jemand ne Lösung?

    Jow, rechne doch über den julianischen Tag, hier zur Kontrolle:

    http://rolfrost.de/datediff.html

    --roro

    1. Huhu,

      AJAX also... hmm.
      Dachte eigentlich ich würde drum herum kommen, aber scheinbar ist dem nicht so :(
      Nicht das ich was gegen AJAX hätte, aber ich kann doch eigentlich erwarten, dass die Gegebenheiten in Javascript... schon der Richtigkeit entsprechen und ich damit arbeiten kann, ohne mir umständliche Lösungen auszusuchen oder eben auf AJAX zu springen.

      Aber scheinbar gibts keine Alternative :(

      Werds dann wohl so machen.

      Vielen Dank!

      1. Moin

        Aber scheinbar gibts keine Alternative :(

        AJAX wegen so einem kleinen Problemchen?

        Ich nutze seit Jahren (also über etliche Browsergenerationen) den o.g. Code und hatte noch nie Probleme.
        Vielleicht postest du mal deine Variante um zu sehen, warum die Murks macht?!

        Gruß
        rfb

        1. *wink*

          Ich nutze seit Jahren (also über etliche Browsergenerationen) den o.g. Code und hatte noch nie Probleme.

          Der von dir geschickte Link arbeitet mit "XMLHttpRequest".
          Ich weiß nicht was vor "Browsergenerationen" da stand. Aber diese Lösung arbeitet zur Berechnung der Tage nicht mit nur mit Javascript, sondern auch über nem CGI-Script.

          Vielleicht postest du mal deine Variante um zu sehen, warum die Murks macht?!

          Habe ich im Eröffnungsbeitrag. Date-Objekte erstellt, per getTime() voneinander abgezogen, durch Sekunden, etc. geteilt, und das falsche Ergebnis bekommen.

          *schubi*

          1. Moin

            Der von dir geschickte Link arbeitet mit "XMLHttpRequest".

            ich hab gar keinen Link gepostet. Bring bitte nicht die Lösungsvorschläge durcheinander.

            Übrigens: der März ist in JavaScript Monat Nr 2!

            Gruß
            rfb

            1. »»ich hab gar keinen Link gepostet. Bring bitte nicht die Lösungsvorschläge durcheinander.

              Yooo, tut mir leid ;)
              Hat sich ja mittlerweile alles erledigt.

      2. hi,

        AJAX also... hmm.

        Muss nicht sein. Den julianischen Tag kannst Du auch mit JS berechnen, Algorithmen dazu hab ich vor einiger Zeit im Inet gefunden.

        --roro

  2. Hallo,

    vieleicht kannst du was damit anfangen!

      
    <script language="JavaScript">  
    <!--  
    function MakeArray(n) {  
    this.length = n;  
    for (var i = 1; i <=n; i++) {  
    this[i] = 0;  
       }  
    }  
    days = new MakeArray(7);  
    days[0] = "Samstag"  
    days[1] = "Sonntag"  
    days[2] = "Montag"  
    days[3] = "Dienstag"  
    days[4] = "Mittwoch"  
    days[5] = "Donnerstag"  
    days[6] = "Freitag"  
    months = new MakeArray(12);  
    months[1] = "Januar"  
    months[2] = "Februar"  
    months[3] = "März"  
    months[4] = "April"  
    months[5] = "Mai"  
    months[6] = "Juni"  
    months[7] = "Juli"  
    months[8] = "August"  
    months[9] = "September"  
    months[10] = "October"  
    months[11] = "November"  
    months[12] = "Dezember"  
    function compute(form) {  
    var val1 = parseInt(form.day.value, 10)  
    if ((val1 < 0) || (val1 > 31)) {  
    alert("Day is out of computable range.")  
    }  
    var val2 = parseInt(form.month.value, 10)  
    if ((val2 < 0) || (val2 > 12)) {  
    alert("Month is out of computable range.")  
    }  
    var val2x = parseInt(form.month.value, 10)  
    var val3 = parseInt(form.year.value, 10)  
    if (val3 < 1900) {  
    alert("Wie alt sind Sie?")  
    }  
    if (val2 == 1) {  
    val2x = 13;  
    val3 = val3-1  
    }  
    if (val2 == 2) {  
    val2x = 14;  
    val3 = val3-1  
    }  
    var val4 = parseInt(((val2x+1)*3)/5, 10)  
    var val5 = parseInt(val3/4, 10)  
    var val6 = parseInt(val3/100, 10)  
    var val7 = parseInt(val3/400, 10)  
    var val8 = val1+(val2x*2)+val4+val3+val5-val6+val7+2  
    var val9 = parseInt(val8/7, 10)  
    var val0 = val8-(val9*7)  
    form.result1.value =form.day.value+". "+months[val2]+" "+form.year.value  
    form.result2.value = days[val0]  
    }  
    // -->  
    </script>  
    <FONT class="stn"><b>Wann haben Sie Geburtstag ?</b><br>  
    <form>  
    <FONT class="stn">Monat (in Zahlen) (1-12):</font><input type="text" name="month" value="12" size=2><br>  
    <FONT class="stn">Tag (1-31):</font><input type="text" name="day" value="09" size=2><br>  
    <FONT class="stn">Jahr (z.B. 1980):</font><input type="text" name="year" value="1973" size=4><p>  
      
    <input type="button" value="Starten" onclick="compute(this.form)">  
    <input type="reset" value="Löschen"><br><FONT class="stn">Geburtsdatum:</font>  
    <input type="text" name="result1" size=18><br><FONT class="stn">Wochentag:</font>  
    <input type="text" name="result2" size=18></form><br></font>  
    
    
    1. Huhu,

      sorry, dieser Lösungsweg passt mir gaaarnicht. Habe mir als Alternative schon ein ähnliches Script zusammen gebaut... aber das Ganze hat meinem "Programmierergewissen" überhaupt nicht gepasst...

      Trotzdem vielen Dank!

      1. hi,

        sorry, dieser Lösungsweg passt mir gaaarnicht. Habe mir als Alternative schon ein ähnliches Script zusammen gebaut... aber das Ganze hat meinem "Programmierergewissen" überhaupt nicht gepasst...

        Die Berechnung mathematisch vernünftig zu machen [1], passt deinem "Programmierergewissen" als nicht?

        [1] Vorausgesetzt, Gugels Vorschlag entspricht dem - hab's nur überflogen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Die Berechnung mathematisch vernünftig zu machen [1], passt deinem "Programmierergewissen" als nicht?

          Das hab ich so nicht gemeint:
          Wieso das Rad neu erfinden, wenn alles vorgegeben ist... okay, in diesem Falle zu sein scheint!?
          Man wir es aber wohl so machen müssen, weil die Javascript-Vorgabe es nicht so macht wie es eigentlich sein sollte (zumindest für dieses Beispiel).

          Als Alternative gäbe es dann wohl nur noch "XMLHttpRequest", wie in einer anderen Antwort vorgeschlagen.

  3. Moin

      
     <script type="text/javascript">  
     <!--  
       var zeit1=Date.UTC(2006,1,26,9,0,0);  
       var zeit2=Date.UTC(2006,2,5,9,0,0);  
       var diff = (zeit2 - zeit1) / (1000 * 60 * 60 * 24);  
       alert(diff);  
     -->  
     </script>  
    
    

    Gruß
    rfb

    1. Moin

      <script type="text/javascript">
      <!--
         var zeit1=Date.UTC(2006,1,26,9,0,0);
         var zeit2=Date.UTC(2006,2,5,9,0,0);
         var diff = (zeit2 - zeit1) / (1000 * 60 * 60 * 24);
         alert(diff);
      -->
      </script>

      
      >   
      > Gruß  
      > rfb  
        
      Mahlzeit,  
        
      Hatte ich auch schon probiert, liefert das gleiche Ergebnis.  
      Trotzdem danke!  
        
      Greetings
      
      1. Moin

        Hatte ich auch schon probiert, liefert das gleiche Ergebnis.

        Nein, tut es nicht - zumindest nicht in dieser Variante (ich kenne ja deine Variante nicht).

        Gruß
        rfb

        1. Nein, tut es nicht - zumindest nicht in dieser Variante (ich kenne ja deine Variante nicht).

          Doch, tut es :(

            
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
          <html>  
          <head>  
            <title>Hello!</title>  
           <script language="JavaScript" type="text/javascript">  
           <!--  
             zeit1 = new Date(2006, 02, 26);  
             zeit2 = new Date(2006, 03, 05);  
            
             diff = Math.round((zeit2.getTime() - zeit1.getTime()) / (1000 * 60 * 60 * 24));  
             alert(diff);  
            
            
             var zeit3=Date.UTC(2006,02,26);  
             var zeit4=Date.UTC(2006,03,05);  
             var diff2 = (zeit4 - zeit3) / (1000 * 60 * 60 * 24);  
             alert(diff2);  
           -->  
           </script>  
          </head>  
          <body>  
          </body>  
          </html>  
          
          
  4. Moin

    Lösung:
    in JavaScript hat der 26.3.2006 als Monatszahl den Wert 2!
    (das unterscheidet deine und meine Varianten)

    Gruß
    rfb

  5. Im folgenden Beispiel wird zwischen dem 26.02.2006 und dem 05.03.2006 eine Differenz von 10 (!!) Tagen angegeben. Das sind 3 oder 2 Tage (je nach Zählart :P ) zuviel.

    Debugging nennt sich in der Programmierung die Fehlersuche, dabei werden z.b. einfach mach mal die Werte angezeigt, die man ermitteln möchte:

      
    zeit1 = new Date(2006, 02, 26);  
    zeit2 = new Date(2006, 03, 05);  
      
    diff = Math.round((zeit2.getTime() - zeit1.getTime()) / (1000 * 60 * 60 * 24));  
      
    alert(  
       zeit1 + '\n'  
       + zeit2  
       + '\n'  
       + diff  
    );  
    
    

    Das ergibt, dass du die Differenz zwischen dem 26. März und 5. April 2006 berechnen lassen willst, dass sind 10 Tage also korrekt.

    Weiß jemand ne Lösung?

    Wenn du wirklich mit 30 Tage pro Monat rechnen willst kannst du natürlich das Date Objekt nicht verwenden, dann musst du die Differenz von Hand berechnen.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Wer lesen kann ist klar im Vorteil *selfslap*.
      Kommt davon, wenn man sich mehr beeilt als nachliest.

      [zitat]
      1. Jahr = Jahreszahl.
      2. Monat = Monatszahl zwischen 0 und 11.
      3. Tag = Tageszahl zwischen 1 und 31.
      [/zitat]

      Nichts destotrotz verstehe ich die Wahl der Monate zw. 0 und 11 nicht. Vor allem in anbetracht der Tatsache, dass dies bei den Tagen nicht durchgezogen wurde. Aber ist auch egal.

      Erst lesen, dann denken :D Ich sags mir immer wieder, aber in der Eile vergisst man es doch des öfteren.

      Vielen Dank!!

      1. Hallo,

        Nichts destotrotz verstehe ich die Wahl der Monate zw. 0 und 11 nicht. Vor allem in anbetracht der Tatsache, dass dies bei den Tagen nicht durchgezogen wurde. Aber ist auch egal.

        Intern arbeitet die Funktion vmtl. mit einem Jahr, das im März beginnt und im Februar aufhört [1] und um den Monat dann umzurechnen, muss sie nur (monat + 10) % 12 machen und um ihn wieder zurückzurechnen (monat + 2) % 12. Natürlich wäre ein (monat + 9) % 12 bzw. (monat + 2) % 12 + 1 genau so schnell gewesen, aber wer weiß, was in den Köpfen so vor sich geht, wenn sie sich etwas ausdenken. ;-)

        Viele Grüße,
        Christian

        [1] Hat den Vorteil, dass die Monatsanfänge sich über "Abrunden (30.6001 * Monat)" berechnen lassen, d.h. man braucht keine Tabelle o.ä.

        --
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup