Probleme mit der Datumsausgabe vor 1970

Alles, was PHP betrifft, kann hier besprochen werden.

Probleme mit der Datumsausgabe vor 1970

Postby gummi » 01. March 2006 20:53

Hallo Zusammen,
bin hier neu. :D So jetzt zu meinem Problem ich habe ein Script das drei Pulldown-Menue hat (Tag, Monat und Jahr), und die werden einfach ausgegeben. Bloß mit Werten vor 1970 bekomme ein Fehler. So hier erst einmal der relevante Teil des Codes:
Code: Select all
<?php


setlocale(LC_ALL, "DEU");
    $allesok = false;
    if( isset($_POST['ueberpruefung']) ) {
        $allesok = true;
    }
    if( $allesok ) {
        $timestamp = mktime(0, 0, 0, $_POST['monat'], $_POST['tag'], $_POST['jahr']); 
        $timestamp = date('d.m.y',$timestamp);
        $ausgabe= $timestamp;
         echo $ausgabe;
    }

?>

Mir ist zwar bekannt das der Unix-Timestamp erst ab 1970 zählt, aber trotzdem weis ich nicht wie Datume ausgeben kann vor 1970.
Kann mir hier vielleicht Jemand einen Tipp. Würde mich darüber freuen
Aleks :?
gummi
 
Posts: 16
Joined: 01. March 2006 20:31
Location: Dortmund

Postby Wiedmann » 01. March 2006 21:07

Code: Select all
<?php
    if (isset($_POST['ueberpruefung'])) {
        $ausgabe = sprintf("%02d.%02d.%02d", $_POST['tag'], $_POST['monat'], $_POST['jahr']);
        echo $ausgabe;
    }
?>
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby KingCrunch » 01. March 2006 21:41

Welche PHP-Version?
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby gummi » 01. March 2006 21:44

Danke erst mal für die schnelle Antwort Wiedmann. Funktioniert auch super! :lol: Was mich wundert ist nur, das in diesem Codebeispiel keine Datumsfunktionen benutzt werden.
Deshalb habe ich noch eine Frage wenn ich das Datum mit checkdate() prüfen will geht? Oder ist das auch nur auf Datume ab 1970 anwendbar.

Würde gerne mal Meinungen zu diesen Thema gerne hören :wink:

Gruß Aleks
gummi
 
Posts: 16
Joined: 01. March 2006 20:31
Location: Dortmund

Postby gummi » 01. March 2006 21:58

Habe PHP Version 5.0.5 mit mit XAMPP 2.1 unter Windows XP laufen.
gummi
 
Posts: 16
Joined: 01. March 2006 20:31
Location: Dortmund

Postby gummi » 01. March 2006 22:04

Huch, ne habe Windows Version 1.5.0-pl1 Tschuldigung!
gummi
 
Posts: 16
Joined: 01. March 2006 20:31
Location: Dortmund

Postby KingCrunch » 01. March 2006 22:05

Anmerkung: Der gültige Bereich eines Timestamp liegt typischerweise zwischen Fri, 13 Dec 1901 20:45:54 GMT und Tue, 19 Jan 2038 03:14:07 GMT. (Das sind die Datumsangaben, die dem minimalen und maximalen Wert eines vorzeichenbehafteten 32-bit Integer entsprechen.) Zusätzlich unterstützen nicht alle Plattformen negative Werte eines Timestamps, deshalb könnte der Wertebereich eines Datums durch den Beginn der Unix Epoche begrenzt sein. Das bedeutet, dass z.B. Zeitangaben vor dem Jan 1, 1970 auf Windowssystemen, einigen Linuxdisrtibutionen und einigen anderen Betriebssytemen nicht funktionieren.

Jetz mein ich gelesen zu haben, dass dies bei einer PHP5-Version an nich mehr beschränkt ist, find den Absatz aber grad nich

@Wiedmann: strtotime ist davon auch betroffen
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby KingCrunch » 01. March 2006 22:13

gefunden, gleicher Absatz, aber in Englisch (deutsche Version sind ja immer ein stückweit langsamer):
Note: The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT. (These are the dates that correspond to the minimum and maximum values for a 32-bit signed integer.) Additionally, not all platforms support negative timestamps, therefore your date range may be limited to no earlier than the Unix epoch. This means that e.g. dates prior to Jan 1, 1970 will not work on Windows, some Linux distributions, and a few other operating systems. PHP 5.1.0 and newer versions overcome this limitation though.

strtotime()

PS: @gummi: Nene, war scho richtig, wollte die PHP-Version wissen
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby gummi » 01. March 2006 22:25

Also irgendwie kann ich nicht dran glauben. Weil wil mein Parser diesen Code:
Code: Select all
<?php


setlocale(LC_ALL, "DEU");
    $allesok = false;
    if( isset($_POST['ueberpruefung']) ) {
        $allesok = true;
    }
    if( $allesok ) {
        $timestamp = mktime(0, 0, 0, $_POST['monat'], $_POST['tag'], $_POST['jahr']); 
        $timestamp = date('d.m.y',$timestamp);
        $ausgabe= $timestamp;
         echo $ausgabe;
    }

?>
und wenn da ein Jahr einstellt kleiner als 1970 gibt es folgende Fehlermeldung:Warning: mktime() [function.mktime]: Windows does not support negative values for this function in C:\Programme\xampp\xampp\htdocs\beispiel.php on line 10

Warning: date() [function.date]: Windows does not support dates prior to midnight (00:00:00), January 1, 1970 in C:\Programme\xampp\xampp\htdocs\beispiel.php on line 11.
Wie würdest Du dieses Fehlermeldung interpretieren? Also meiner Meinung nach zählt der Unix-Timestamp erst ab 1970, oder etwa nicht?

Gruß Aleks
gummi
 
Posts: 16
Joined: 01. March 2006 20:31
Location: Dortmund

Postby KingCrunch » 01. March 2006 22:28

Du hast aber auch gelesen, was ich geschrieben habe?!?
Note: The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT. (These are the dates that correspond to the minimum and maximum values for a 32-bit signed integer.) Additionally, not all platforms support negative timestamps, therefore your date range may be limited to no earlier than the Unix epoch. This means that e.g. dates prior to Jan 1, 1970 will not work on Windows, some Linux distributions, and a few other operating systems. PHP 5.1.0 and newer versions overcome this limitation though.
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby gummi » 01. March 2006 22:28

Hub ich habe ja nur PHP-5.0.5!!! :roll: Das ist haber jetzt peinlich :shock:
gummi
 
Posts: 16
Joined: 01. March 2006 20:31
Location: Dortmund

Postby Wiedmann » 01. March 2006 22:45

Was mich wundert ist nur, das in diesem Codebeispiel keine Datumsfunktionen benutzt werden.

Die Aufgabe war doch nur, die 3 Teilstrings als ein formatierter String auszugeben. Formartierung ist: Tag/Monat/Jahr jeweils 2stellig mit führenden Nullen.

Zuwas soll ich die 3 Strings in einen Timestamp umwandeln und den Timestamp dann erst in den formatierten String? Ganz abgesehen von der limitation eines Timestamps...

Deshalb habe ich noch eine Frage wenn ich das Datum mit checkdate() prüfen will geht? Oder ist das auch nur auf Datume ab 1970 anwendbar.

Wie du im Manual lesen kannst, geht checkdate() mit jedem Datum (4714 BC bis 9999 AD).
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby gummi » 05. March 2006 11:30

Hallo Tschuldigung das mich ein paar Tage nitcht gemeldet habe... hatte ein paar Problem mit meinem Internetzugang.
So jetzt haber zurück zum Thema:ich habe das Script etwas weiter entwickelt es sieht jetzt so aus:
Code: Select all
<?php


setlocale(LC_ALL, "DEU");
    $allesok = false;
    if( isset($_POST['ueberpruefung']) ) {
        $allesok = true;
    }
    if( $allesok ) {
    $timestamp = mktime(0, 0, 0, $_POST['monat'], $_POST['tag'], $_POST['jahr']);
      if(($POST_['tag']!='Tag')&&($_POST_['monat']!='Monat')&&($_POST['jahr']!='Jahr'))
      { 
        if(checkdate($_POST['monat'],$_POST['tag'],$_POST['jahr']))
        {
        $timestamp = date('d.m.Y',$timestamp);
        $ausgabe= $timestamp;
        echo "Der $ausgabe ist ein gültiges Datum";
      }
      else
      {
       echo "Das Datum ist falsch";
     }
   }
   else
   {
     echo "Sie müssen ein Datum auswählen";
   }
    }

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Datum per Formular</title>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="ueberpruefung" value="1" />
<select name="tag">
<?php
    echo'<option selected>Tag</option> ';
    for( $i=1; $i<=31; $i++ ) {
    if($_POST['tag'] == $i) {
            echo '<option value="'.$i.'" selected>'.$i.'</option>';
    }
      else {
            echo '<option value="'.$i.'">'.$i.'</option>';
    }
    }
?>
</select>
Tag
&nbsp;

<select name="monat">
<?php
    echo'<option value=""selected>Monat</option> ';
   for( $i=1; $i<=12; $i++ ) {
    if($_POST['monat'] == $i) {
            echo '<option value="'.$i.'" selected>'.$i.'</option>';
    }
    else {
            echo '<option value="'.$i.'">'.$i.'</option>';
    }
    }
?>
</select>
Monat
&nbsp;

<select name="jahr">
<?php
    echo'<option value=""selected>Jahr</option> ';
   $aktuellesJahr = date('Y');
    for($i=($aktuellesJahr - 110); $i<=$aktuellesJahr+1; $i++ ) {
    if($_POST['jahr'] == $i) {
            echo '<option value="'.$i.'" selected>'.$i.'</option>';
    }
    else {
            echo '<option value="'.$i.'">'.$i.'</option>';
    }
    }
?>
</select>   
Jahr
<br />
<input type="submit" name="Anmeldung" value="Absenden" />
</form>
</body>
</html>

Jetzt habe mit diesem Code ein kleines Problem wenn Jemand versehendlich Tag, Monat, Jahr abschickt, dann gibt der Parser zum einem zwei Warnungen aus und zum anderen spring in die Falsche Schleife. Konkred er sollte dann den Text ausgeben:"Sie müssen ein Datum auswählen", aber gibt aus:"Das Datum ist falsch" :?
Und jetzt habe ein paar Fragen dazu: 1. Wieso gibt er den falschen Text aus. 2. Soll ich die Warnungen unterdrücken mit den"@"Zeichen oder muß man dies ganz anders lösen? Wäre für jeden Vorschlag dankbar.

Gruß Aleks
gummi
 
Posts: 16
Joined: 01. March 2006 20:31
Location: Dortmund

Postby KingCrunch » 05. March 2006 11:47

Welche Warnungen tauchen denn auf? (Hab nich so Lust das Script sooo tief zu durchforsten. Interessante Formatierung übrigens ;))

Wenn alle drei Eingaben NICHT ihren Stanard ("Tag","Monat","Jahr") entsprechen, springt er in den Abfrageblock
Code: Select all
if(($POST_['tag']!='Tag')&&($_POST_['monat']!='Monat')&&($_POST['jahr']!='Jahr'))

wenn dann eine Eingabe doch noch dem Standard entspricht, springt er in den else-Bock der Abfrage
Code: Select all
if(checkdate($_POST['monat'],$_POST['tag'],$_POST['jahr']))

Du solltest also prüfen, ob die Standards richtig gewählt wurden (also in der Abfrage)
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby gummi » 05. March 2006 12:32

Hallo KingCrunch dank erst mal für die Antwort.
Welche Warnungen tauchen denn auf?
Nun diese:Warning: mktime() expects parameter 4 to be long, string given in C:\Programme\xampp\xampp\htdocs\beispiel.php on line 10

Warning: checkdate() expects parameter 1 to be long, string given in C:\Programme\xampp\xampp\htdocs\beispiel.php on line 13.

Ich habe ein bißchen verbessert so ist für mich jedenfalls perfekt:
Code: Select all
<?php

    setlocale(LC_ALL, 'DEU');
    $allesok = false;

    if( isset($_POST['ueberpruefung']) ) {
        $allesok = true;
    }

    if( $allesok ) {
        if( @checkdate($_POST['monat'], $_POST['tag'], $_POST['jahr']) ) {
            $timestamp = mktime(0, 0, 0, $_POST['monat'], $_POST['tag'], $_POST['jahr']);
            echo 'Der '.date('d.m.Y', $timestamp).' ist ein gültiges Datum.';
        } else {
            echo 'Das Datum ist kein gültiges Datum.';
        }
    }

?>
Trotzdem nochmal danke :D
gummi
 
Posts: 16
Joined: 01. March 2006 20:31
Location: Dortmund


Return to PHP

Who is online

Users browsing this forum: No registered users and 2 guests