Martin_Online: Alter errechnen

Guten Abend,

hab diesen Code im Netz gefunden

  
    $jahr = 1986;  
    $mon  =   4;  
    $tag  =    26;  
  
    $alter = (date('Y') - $jahr) - intval((date('j') < $tag) AND (date('n' ) <= $mon) );  
  
    echo $alter ;  

wird hier das Schaltjahr berücksichtigt? Will damit erreichen dass das Alter von einem User angezeigt wird. Er muss 18 Jahre sein.

  1. Hello,

    hab diesen Code im Netz gefunden

    $jahr = 1986;
        $mon  =   4;
        $tag  =    26;

    $alter = (date('Y') - $jahr) - intval((date('j') < $tag) AND (date('n' ) <= $mon) );

    echo $alter ;

    
    >   
    > wird hier das Schaltjahr berücksichtigt? Will damit erreichen dass das Alter von einem User angezeigt wird. Er muss 18 Jahre sein.  
      
    Ich bin mir nicht sicher, ob diese Funktionen überhaupt mit Daten vor dem 01.01.1970 umgehen können.  
      
    Und ob das Schaltjahr wichtig ist, ist doch nur genau in einem Schaltjahr für Leute wichtig, die am 29. Februar Geburtstag haben. Dann werden sie nämlich schon an diesem Tag volljährig und nicht erst am nächsten.  
      
    Das ist ja kein mathematisches Problem, sondern ein rechtliches.  
      
    Du solltest deshalb auch prüfen, was das Gesetz zur Volljährigkeit sagt. Wir der/diejenige mit dem Ablauf oder mit dem Beginn des Geburts-Jahrestages volljährig, oder ist da auch noch die Uhrzeit relevant?  
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    [Die ultimative Seite für Selbermacher](http://getscript.de/)
    
    1. Hallo Tom,

      Ich bin mir nicht sicher, ob diese Funktionen überhaupt mit Daten vor dem 01.01.1970 umgehen können.

      Und ob das Schaltjahr wichtig ist, ist doch nur genau in einem Schaltjahr für Leute wichtig, die am 29. Februar Geburtstag haben. Dann werden sie nämlich schon an diesem Tag volljährig und nicht erst am nächsten.

      Das ist ja kein mathematisches Problem, sondern ein rechtliches.

      Du solltest deshalb auch prüfen, was das Gesetz zur Volljährigkeit sagt. Wir der/diejenige mit dem Ablauf oder mit dem Beginn des Geburts-Jahrestages volljährig, oder ist da auch noch die Uhrzeit relevant?

      Soweit möchte ich nicht gehen also mit der Uhrzeit. Auf meiner Seite gibt es unter anderem auch „erotische Bilder“ die sind laut Anwalt alle FSK12 (nichts was man auch z.B. im TV in diversen Serien sieht) aber dennoch möchte ich einfach keine „Kinder“ auf dieser Seite haben. Deshalb steht auch in den AGB dass man mindestens 18 Jahre sein muss. Wenn ich sehe dass einer keine 18 Jahre ist, wird dieser sofort gelöscht.

      Die Bilder werden alle von einem unabhängigen Jugendschutzbeauftragten geprüft.

      Diese Option ist einfach nur zu meiner eigenen Beruhigung.

      1. Mahlzeit,

        Deshalb steht auch in den AGB dass man mindestens 18 Jahre sein muss. Wenn ich sehe dass einer keine 18 Jahre ist, wird dieser sofort gelöscht.

        Und du glaubst wirklich ,dass das ein Hindernis ist, ein Datum anzugeben, das aussagt jemand ist über 18 ist?

        Ansonsten rechne ich mit Unix-Timestamp, da sind Schaltjahre nicht relevant. Allerdings klappt das erst ab 01.01.1970.
        Allerdings musst du ja nur das eingegebene Datum in eine Timestamp wandeln und mit der auf dem Server vergleichen. Dann berücksichtigst du automatisch auch die Uhrzeit auf die Zehntelsekunde ;)

        --
        42
        1. Hallo,

          Und du glaubst wirklich ,dass das ein Hindernis ist, ein Datum anzugeben, das aussagt jemand ist über 18 ist?

          Nein das nicht, aber wenn jemand ein falsches Datum angibt, warum auch immer, darf ich diesen laut AGB _sofort_ löschen. Wie gesagt dieses ist nur eine kleine Absicherung für _mich_ Laut Gesetz müsste ich gar kein Alter prüfen.

          1. Mahlzeit,

            Wie gesagt dieses ist nur eine kleine Absicherung für _mich_

            Nein, ist es nicht. Eine offensichtlich nutzlose Prüfung schützt nicht vor juristischen Konsequenzen. Bei einer evtl. Gerichtsverhandlung kann es sogar negativ ausgelegt werden, wenn du wissentlich eine solche Prüfung einbaust, da du ja weisst, das sie nutzlos ist.

            Frag mich nicht, wie der Jurist das nennt, ich bin keiner und kann dir lediglich das sagen, was mir in meiner Laufbahn untergekommen ist.

            Laut Gesetz müsste ich gar kein Alter prüfen.

            Dann versteh ich das eh nicht. Eine sinnlose Prüfung, die nicht nötig ist aber du investierst deine Zeit. Wenn du die Zeit für sinnvolleres einsetzen würdest, wäre dem Besucher sicher besser geholfen.

            Nur meine Meinung, ich persönlich hab keine Zeit für solch unnützes Programmiergedöns, ich nutze meine begrenzte Zeit lieber für effektive DInge ;)

            --
            42
        2. Hello,

          Allerdings musst du ja nur das eingegebene Datum in eine Timestamp wandeln und mit der auf dem Server vergleichen. Dann berücksichtigst du automatisch auch die Uhrzeit auf die Zehntelsekunde ;)

          Dann hat er aber das Problem, dass er die Schaltjahre in den Timestamp reinrechnen muss.

          Besser ist es, mit den diskreten Angaben für Jahr (YYYY), Monat (MM), Tag (DD) umzugehen, auf das Jahr vom Geburtstag 18 aufzuaddieren, die wieder zu einer "Nummer" zusammenzufügen und zu vergleichen.

          Das ist dann auch Conchita, ob man das als numerische Größen, oder als Strings vergleicht, solange die Darstellungen der Digits in der Kollation in der Reihenfolge "0, 1, 2, 3, 4, 5, 6, 7, 8, 9" stehen ;-P

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          Die ultimative Seite für Selbermacher
          1. Mahlzeit,

            Dann hat er aber das Problem, dass er die Schaltjahre in den Timestamp reinrechnen muss.

            Wieso denn das? strtotime() wandelt das eingegebene Datum in ne Timestamp. Wieso sollte ich da selbst das Schaltjahr einrechnen müssen?

            --
            42
            1. Hello,

              Dann hat er aber das Problem, dass er die Schaltjahre in den Timestamp reinrechnen muss.

              Wieso denn das? strtotime() wandelt das eingegebene Datum in ne Timestamp. Wieso sollte ich da selbst das Schaltjahr einrechnen müssen?

              Seit wann bist Du so kleinlich? Ob das nun strtotime() für ihn macht, oder er es "zu Fuß" reinrechnet, ist doch hier unerheblich.

              Ich wollte nur klamachen: Er muss nicht mit dem Schaltjahr rechnen.

              Und warum soll er ein human readable Format YYYYMMDD, in dem (oder ähnlich) der User die Daten sowieso eingibt, erst teuer umrechnen in einen Timestamp, das Tagesdatum dann auch umrechnen in einen Timestamp, usw., wenn er durch ganz einfachen Vergleich der Rohdaten mit einer Addition und einem Vergleich das gewünschte Ergebnis hat?

              Ich sehe das Schaltjahr da nirgends mehr drin, denn

              "2014"."07"."06" >= (1996+18)."07"."06"   # String-Konkatination

              Die einzelnen Fragmente sind vorher auf die vorgeschriebene Stellenzahl mit führenden Nullen aufzufüllen. Die müssen ja ohnehin auf ihre Ranges geprüft werden.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              Die ultimative Seite für Selbermacher
              1. Mahlzeit,

                Seit wann bist Du so kleinlich? Ob das nun strtotime() für ihn macht, oder er es "zu Fuß" reinrechnet, ist doch hier unerheblich.

                Ich bin nicht kleinlich, ich war nur verwirrt, weil du gesagt hast, bei einer Timestamp muss man das Schaltjahr per hand reinrechnen.

                Ich wollte nur klamachen: Er muss nicht mit dem Schaltjahr rechnen.

                Genau das Gegenteil hab ich rausgelesen. Ok, dann ist das jetzt ja klar ;)

                Und warum soll er ein human readable Format YYYYMMDD, in dem (oder ähnlich) der User die Daten sowieso eingibt, erst teuer umrechnen in einen Timestamp, das Tagesdatum dann auch umrechnen in einen Timestamp, usw., wenn er durch ganz einfachen Vergleich der Rohdaten mit einer Addition und einem Vergleich das gewünschte Ergebnis hat?

                Also nach meinen Tests ist die Umrechnung nicht teuer, aber die Timestamp ist wesentlich universeller. Ich speicher fast immer die Timestamp und erzeuge bei Bedarf das Datum im gewünschten Format.

                "2014"."07"."06" >= (1996+18)."07"."06"   # String-Konkatination

                Die einzelnen Fragmente sind vorher auf die vorgeschriebene Stellenzahl mit führenden Nullen aufzufüllen. Die müssen ja ohnehin auf ihre Ranges geprüft werden.

                Und das hälst du für einfacher als einfach per Funktion das Datum in eine Integer zu wandeln und dann zu vergleichen? Wenn das Datum per strtotime umgewandelt wird, dabei das Datum aber ungültig ist, wird doch eh ein Fehler geworfen.

                --
                42
                1. Hello,

                  Also nach meinen Tests ist die Umrechnung nicht teuer, aber die Timestamp ist wesentlich universeller. Ich speicher fast immer die Timestamp und erzeuge bei Bedarf das Datum im gewünschten Format.

                  Aber können die benötigten Funktionen auch mit Timestamps kleiner 0 umgehen? Das sollte ja mal eingepflegt werden, aber ich habe es nicht überprüft.

                  Wie lautet der Timestamp-Datumsbereich in PHP aktuell?

                  ?        bis 2038-01-19 03:14:07

                  Der offizielle Unix-Timestamp beginnt erst am 01.01.1970
                  Dann wäre er für die Geburtstags- und Altersrechnung nutzlos, wenn man nicht wieder direkt die Jahreszahl vergleichen will vorher...

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  Die ultimative Seite für Selbermacher
                  1. Hello,

                    Wie lautet der Timestamp-Datumsbereich in PHP aktuell?

                    1901-12-13, 21:45:53  bis  2038-01-19 03:14:07

                    Das funktioniert:

                    echo date('Y-m-d, H:i:s', -PHP_INT_MAX);

                    Ob die anderen Datumsfunktionen das inzwischen auch können, weiß ich nicht.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    Die ultimative Seite für Selbermacher
                  2. Mahlzeit,

                    Der offizielle Unix-Timestamp beginnt erst am 01.01.1970
                    Dann wäre er für die Geburtstags- und Altersrechnung nutzlos, wenn man nicht wieder direkt die Jahreszahl vergleichen will vorher...

                    Da jemand, der vor dem 01.01.1970 geboren wurde, so ganz knapp bereits volljährig ist, ist es ja kein Problem. Sollte die Timestamp kleiner 0 sein, ist die Person definitiv über 18.

                    Wenn ich das Alter berechnen will, hast du natürlich recht, dann ist die Timestamp natürlich in dieser Form nutzlos.

                    --
                    42
      2. Hello,

        im Gesetz kann ich es nicht finden, nur in der Rentenversicherungsverordnung...

        Format:

        YYYYMMDD

        Volljärig = Geburtstag(YYYY+18, MM, DD) >= Tagesdatum (YYYYMMDD);

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        Die ultimative Seite für Selbermacher
    2. Hello,

      Und ob das Schaltjahr wichtig ist, ist doch nur genau in einem Schaltjahr für Leute wichtig, die am 29. Februar Geburtstag haben. Dann werden sie nämlich schon an diesem Tag volljährig und nicht erst am nächsten.

      Allerdings habe ich im Gedächtnis, dass der rechtliche Geburtstag eines Menschen, der am 29. Februar geboren worden ist, ohnehin der 01. März ist.

      Dann wäre die rechtliche Volljährigkeit ohnehin erst mit Beginn des 19. Lebensjahres gegeben, also am 01. März des Jahres.

      http://www.gesetze-im-internet.de/bgb/__2.html

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      Die ultimative Seite für Selbermacher
    3. Hi,

      Und ob das Schaltjahr wichtig ist, ist doch nur genau in einem Schaltjahr für Leute wichtig, die am 29. Februar Geburtstag haben. Dann werden sie nämlich schon an diesem Tag volljährig und nicht erst am nächsten.

      Wer am 29.02. geboren ist, wird nicht an einem 29.02. volljährig - zumindest solange die Volljährigkeit mit 18 erreicht wird und die derzeitige Schaltjahrregel gültig ist.

      Schaltjahre sind auf jeden Fall ohne Rest durch 4 teilbar (auch wenn nicht jedes durch 4 teilbare Jahr ein Schaltjahr ist).

      ⇒ Geburtsjahr ist ohne Rest durch 4 teilbar (wegen 29.02. als Geburtsdatum).

      ⇒ Volljährigkeitsjahr ist nicht ohne Rest durch 4 teilbar, wegen:
      Geburtsjahr durch 4 teilbar, plus die Tatsache, daß 18 nicht ohne Rest durch 4 teilbar ist - damit ist Geburtsjahr + 18 niemals (Einschränkungen siehe oben) durch 4 teilbar.

      Wer am 29.02. geboren wurde, wird am 1. März volljährig - niemals am 29.02.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. Hello,

        Wer am 29.02. geboren ist, wird nicht an einem 29.02. volljährig - zumindest solange die Volljährigkeit mit 18 erreicht wird und die derzeitige Schaltjahrregel gültig ist.

        Stimmt bei "vollendetem 18. Lebensjahr". Da hast Du selbstverständlich Recht.
        Aber das Schaltjahr ist vollkommen unerheblich.
        Das benötigt man bestenfalls für die Range-Prüfung der Angaben des Users.

        Entweder ist das Datum MMDD des Tages größer oder gleich als/wie das des Geburtstages, YYYY des Tages muss YYYY+18 des Geburtstages sein oder ebejn nicht.

        Wer am 29.02. geboren wurde, wird am 1. März volljährig - niemals am 29.02.

        Das gilt aber eben nur für "volljährig mit 18"

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        Die ultimative Seite für Selbermacher
        1. Hi,

          Das gilt aber eben nur für "volljährig mit 18"

          Nö. Auch z.B. für die vorherige Regelung "volljährig mit 21". Für jede Variante, bei der das Volljährigkeits-Alter nicht durch 4 teilbar ist.

          Aber die Einschränkung, daß das nur unter gewissen Voraussetzungen gilt, hatte ich ja erwähnt.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  2. Guten Abend,

    ich würde, bezogen auf das aktuelle Datum, das Alter in Tagen ausrechnen, das durch die mittlere Jahreslänge (365,2425 Tage) teilen und denken, dass ich damit auf der richtigen Seite bin. In die Berechnung der Tage fürs Alter gehen die Schaltjahre ein.

    Sofern es einen juristischen Hintergrund gibt, würde ich die "Formel zur Altersberechnung" benutzen, welche der Gesetzgeber vorsieht (egal was dabei rauskommt).

    MfG

  3. Hallo,

    die Frage ist, ob ich hier auf dem richtigen Weg bin

      
    $Jahre = 55;  
    $ThisYear = date("Y")-18;  
    for ($i = 1; $i < $Jahre; $i++) {  
    echo "<option value=\"$ThisYear\">$ThisYear</option>\r";  
    $ThisYear--;  
    }  
    ?>  
    
    

    Ich möchte nicht jedes Jahr von Hand schreiben da dieses sich jedes Jahr ändert. So OK, oder würdet ihr es anderes machen?

    Das gleiche würde ich dann mit dem Monat und Tag machen. Alternativ könnte ich natürlich auch auf den Datepicker von jQuery UI zurück greifen, dieser kann das auch.

    1. Mahlzeit,

      Ich möchte nicht jedes Jahr von Hand schreiben da dieses sich jedes Jahr ändert. So OK, oder würdet ihr es anderes machen?

      Ich ja, ab er offensichtlich stehst du auf kompliziert.
      Da kann ich nicht mitreden, meine Lösung hat dir ja nicht gefallen ;)

      --
      42
    2. Hallo,

      hab gerade irgendwie ein Hänger :/ diese Code bereitet mir Probleme

        
      if ($value == $_POST['i_geb_monat']) {  
      
      

      wenn die Seite das erste mal aufgerufen wird, ist in $_POST nichts drin, daher bekomme ich ein Notice: Undefined index

      Ist zwar nicht schlimm, steht nur im Quelltext aber mich nervt es. Wollte es so lösen, klappt aber nicht

        
      if ($value == (isset($_POST['i_rubrik'])) ? $_POST['i_rubrik'] :'') {  
      
      

      bzw. es klappt, der Felher ist erstmal weg, mache ich eine Eingabe, klicke auf abschicken kommt ein totaler Müll raus.

      1. Hello,

        Wollte es so lösen, klappt aber nicht

        if ($value == (isset($_POST['i_rubrik'])) ? $_POST['i_rubrik'] :'') {

        
        >   
          
        Die { zeigt ja, dass es da noch weitergehen soll...  
          
        Ein Tipp: Schreib expliziten Code. Das ist leichter zu lesen und braucht auch nicht viele mehr Bytes im Quelltext.  
          
          
        ~~~php
          
            if (isset($_POST['i_rubrik']) and is_string($_POST['i_rubrik']))  
            {  
                ## DD.MM.YYYY ##  
                if (strlen($_POST['i_rubrik']) == 10)  
                {  
          
                     ## an den Punkten zerlegen, Einzelwerte prüfen (Ranges), usw.  
                     ## [link:http://de1.php.net/manual/en/function.checkdate.php]  
                     ## Datumsvergleich durchführen  
                }  
                else  
                {  
                     ## Fehlermeldung setzen: "Datum muss in der Form TT.MM.JJJJ angegeben werden!"  
                }  
            }  
          
        
        

        Nur als Vorschlag.

        PHP kennt an dieser Stelle erstmal nur die Datenklassen String (Skalere) und Array. Andere Prüfungen haben hier mMn keinen Sinn. Das bedeutet, dass auch Zahlen in der Stringdarstellung aus der Schnittstelle rauskommen.

        Bei Checkdate musst Du zusätzlich noch prüfen, ob das Jahr im erlaubten Bereich für PHP-Unix-Timestamps liegt, wenn Du mit den timestamp-behafteten Funktionen von PHP arbeiten willst.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        Die ultimative Seite für Selbermacher
  4. Guten Abend,

    hab diesen Code im Netz gefunden

    schau dir mal das DateTimeInterface an.
    Das verwende ich immer für solche "Operationen".
    Mit "now" hast du auch immer das aktuelle Datum.
    Lesenswert sind auch die User Beispiele und Kommentare.

    Gruß Gunther