strtotime bringt auf Windows-System falsche Antwort

strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 13:41:10 von Michael Vogel

Hi!

Ich setze strtotime ein, um aus einem Zeitstring (z.B. "14:43:22") einen
Timestamp zu erzeugen. Dies klappte bislang auf jedem System. Nur habe ic=
h
jetzt ein System (Windows XP, xampp (Version unbekannt), PHP Version 5.x)=
,
das bei strtotime von einem Zeitwert (z.B. "12:40:31") keinen gültigen
Timestamp erzeugt, jedoch von einem deutschen Datum "07.08.2006" klappt e=
s.

Kann man eigentlich etwas an der Funktion bezüglich der Interpretation =
von
Werten einstellen? Oder sind Probleme mit der Funktion bekannt?

Michael

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 14:14:46 von Frank Schenk

Michael Vogel wrote:
> Hi!
>=20
> Ich setze strtotime ein, um aus einem Zeitstring (z.B. "14:43:22") eine=
n
> Timestamp zu erzeugen. Dies klappte bislang auf jedem System. Nur habe =
ich
> jetzt ein System (Windows XP, xampp (Version unbekannt), PHP Version 5.=
x),
> das bei strtotime von einem Zeitwert (z.B. "12:40:31") keinen gültige=
n
> Timestamp erzeugt, jedoch von einem deutschen Datum "07.08.2006" klappt=
es.
>=20
> Kann man eigentlich etwas an der Funktion bezüglich der Interpretatio=
n von
> Werten einstellen? Oder sind Probleme mit der Funktion bekannt?

Checkliste:

[ ] Welche PHP Version verwendest du?
[ ] Wie ist sie konfiguriert?
[ ] Was gibts strtotime zurück?
[ ] Die Lektüre des Handbuchs brachte dich zu welchen Erkenntnissen?
[ ] Was hast du getan, um das Problem zu finden?
[ ] Was hast du wie debuggt?
[ ] Was ist mit der Zeitzone?
[ ] Hast du dir den Bugtracker nach ausführlicher Lektüre des Handbuc=
hs=20
angeschaut?
[ ] Wie sieht dein Code aus?

Wenn du alle Punkte bis auf den Letzten abgehakt hast kannst gerne=20
wieder vorbeischauen - bitte aber mit einem Codeauszug, hier ist nicht=20
die lustige PHP Fehlerraterunde.


gruß, Frank

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 14:26:38 von Carsten Wiedmann

Michael Vogel schrieb:

> Ich setze strtotime ein, um aus einem Zeitstring (z.B. "14:43:22") einen
> Timestamp zu erzeugen. Dies klappte bislang auf jedem System. Nur habe ich
> jetzt ein System (Windows XP, xampp (Version unbekannt), PHP Version 5.x),
> das bei strtotime von einem Zeitwert (z.B. "12:40:31") keinen gültigen
> Timestamp erzeugt, jedoch von einem deutschen Datum "07.08.2006" klappt
> es.

Vielleicht solltest du ein Codebespiel liefern, was ausgegeben wird und was
du stat dessen erwartest...

BTW:
| E:\xampp\php>php -n -r "echo PHP_VERSION;"
| 5.1.4
| E:\xampp\php>php -n -r "echo date('c', strtotime('14:43:22'));"
| 2006-08-07T14:43:22+02:00

stimmt also.

Gruß
Carsten

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 14:48:31 von Sven Drieling

Michael Vogel wrote:

Hallo,

> Nur habe ich
> jetzt ein System (Windows XP, xampp (Version unbekannt), PHP Version =
5.x),
> das bei strtotime von einem Zeitwert (z.B. "12:40:31") keinen gülti=
gen
> Timestamp erzeugt,

Mit "kein gültiger Timestamp" ist -1 bzw. false ab PHP 5.1.0 gemeint=
? Das
scheint mir in Richtung Fehler in PHP zu tendieren.
=20
=20
Welche PHP-Version konkret? In PHP 5.1.3 wurde z.B. folgendes behoben:=

=20
Bug #37017 strtotime fails before 13:00:00 with some time zones identi=
fiers
http://bugs.php.net/bug.php?id=3D37017

=20
> Kann man eigentlich etwas an der Funktion bezüglich der Interpretat=
ion von
> Werten einstellen? Oder sind Probleme mit der Funktion bekannt?

Die Einstellung der Zeitzone hat Einfluss auf strtotime().


tschuess
[|8:)

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 15:06:37 von Michael Vogel

Moin!

Carsten Wiedmann wrote:
>=20
> Vielleicht solltest du ein Codebespiel liefern, was ausgegeben wird und=
was=20
> du stat dessen erwartest...

//Prüfung, ob im Uhrzeitfeld wirklich eine Uhrzeit steht.=20
//Falls dort ein Datum steht, ist der Timestamp größer 82800
if ((strtotime($fields['time'],0) <=3D 0) or (strtotime($fields['time'],0=
) > 82800))
return(array('time' =3D> 'Die Uhrzeit ist ungültig.'));

Es ist sichergestellt und getestet, dass in $fields['time'] tatsächlich=
ein
Zahlenstring im Format "HH:MM:SS" steht.
=20
> BTW:
> | E:\xampp\php>php -n -r "echo PHP_VERSION;"
> | 5.1.4

Die 5.1.4 habe ich hier auch. Und _eigentlich_ sollte auf dem Zielsystem
auch 5.1.4 drauf sein, da es auch hier aus der Firma kommt. (Ich jetzt nu=
r
nicht raufkomme, da das Gerät nebst Benutzer mehrere 100km entfernt ist=
)

Michael

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 15:42:03 von Sven Drieling

Michael Vogel wrote:

Hallo,

> //Prüfung, ob im Uhrzeitfeld wirklich eine Uhrzeit steht.
> //Falls dort ein Datum steht, ist der Timestamp größer 82800
> if ((strtotime($fields['time'],0) <=3D 0) or (strtotime($fields['time=
'],0) >
> 82800)) return(array('time' =3D> 'Die Uhrzeit ist ungültig.'));

Zeigt denn var_dump(strtotime($fields['time'], 0)) das Ewartete an?


Ab PHP 5.1.0 würde ich statt auf < 0 erst einmal auf=20
strtotime(...) !== false testen.

Abhängig von der eingestellten Zeitzone ergeben sich Datumsangaben
über den 1. Januar 1970 hinaus und auch kleiner 0 ist denkbar.=20

echo strtotime('00:00:00', 0), "
";
=3D> -3600

Müsste sich theoretisch mit Anhängen von GMT unterdrücken lassen.=



Als Alternative die Angabe mit split()/preg_match() zerlegen und
selbst auf 0-23, 0-59 und 0-59 testen.


tschuess
[|8:)

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 16:45:45 von Niels Braczek

Michael Vogel schrieb:

> //Prüfung, ob im Uhrzeitfeld wirklich eine Uhrzeit steht.=20
> //Falls dort ein Datum steht, ist der Timestamp größer 82800
> if ((strtotime($fields['time'],0) <=3D 0) or (strtotime($fields['time']=
,0) > 82800))
> return(array('time' =3D> 'Die Uhrzeit ist ungültig.'));

Erstens: Warum berechnest du die Zeit zweimal?
$t =3D strtotime( $fields['time'], 0 );
if ( $t <=3D 0 || $t > 82800 ) {...}

> Es ist sichergestellt und getestet, dass in $fields['time'] tatsächli=
ch ein
> Zahlenstring im Format "HH:MM:SS" steht.

Warum testest du dann nicht
if ( $fields['time'] <=3D '00:00:00' || $fields['time'] > '22:56:40' ) {.=
.}
?

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 18:42:20 von Sven Drieling

Niels Braczek wrote:

Hallo,

> Warum testest du dann nicht
> if ( $fields['time'] <=3D '00:00:00' || $fields['time'] > '22:56:40' =
) {...}

Das akzeptiert z.B. auch '22:00', '12:abc' oder die Integerzahl 12 ode=
r die
Floatzahlen 1.234, 1.234E1 oder den String '1.234E1' als gültige
Eingaben, wenn $fields['time'] nicht vorher schon eingeschränkt wurd=
e,
weil die automatische Typkonvertierung von PHP aktiv wird.


tschuess
[|8:)

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 19:24:47 von Norbert Melzer

Am Mon, 07 Aug 2006 18:42:20 +0200 schrieb Sven Drieling:

> Niels Braczek wrote:
>
>> Michael Vogel schrieb:
>>>
>>> Es ist sichergestellt und getestet, dass in $fields['time'] tatsächlich ein
>>> Zahlenstring im Format "HH:MM:SS" steht.
>>
>> Warum testest du dann nicht
>> if ( $fields['time'] <= '00:00:00' || $fields['time'] > '22:56:40' ) {...}
>
> Das akzeptiert z.B. auch '22:00', '12:abc' oder die Integerzahl 12 oder die
> Floatzahlen 1.234, 1.234E1 oder den String '1.234E1' als gültige
> Eingaben, wenn $fields['time'] nicht vorher schon eingeschränkt wurde,
> weil die automatische Typkonvertierung von PHP aktiv wird.

Quoting ergänzt, damit dürfte Dein Einwand wieder ausgehebelt sein, der
OP hat bereits auf das Format HH:MM:SS getestet.

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 20:18:14 von Carsten Wiedmann

Norbert Melzer schrieb:

> Am Mon, 07 Aug 2006 18:42:20 +0200 schrieb Sven Drieling:
>
> > Niels Braczek wrote:
> >
> > > Michael Vogel schrieb:
> > > >
> > > > Es ist sichergestellt und getestet, dass in $fields['time']
> > > > tatsächlich ein Zahlenstring im Format "HH:MM:SS" steht.
> > >
> > > Warum testest du dann nicht
> > > if ( $fields['time'] <= '00:00:00' || $fields['time'] > '22:56:40'
> > > ) {...}
> >
> > Das akzeptiert z.B. auch '22:00', '12:abc' oder die Integerzahl 12
> > oder die Floatzahlen 1.234, 1.234E1 oder den String '1.234E1' als
> > gültige
> > Eingaben, wenn $fields['time'] nicht vorher schon eingeschränkt wurde,
> > weil die automatische Typkonvertierung von PHP aktiv wird.
>
> Quoting ergänzt, damit dürfte Dein Einwand wieder ausgehebelt sein, der
> OP hat bereits auf das Format HH:MM:SS getestet.

Ich würde sagen das hat der OP noch nicht:
> > > > //Prüfung, ob im Uhrzeitfeld wirklich eine Uhrzeit steht.
> > > > //Falls dort ein Datum steht, ist der Timestamp größer 82800
> > > > if ((strtotime($fields['time'],0) <= 0) or
> > > > (strtotime($fields['time'],0) > 82800))
> > > > return(array('time' => 'Die Uhrzeit ist ungültig.'));

Wüsste er das dort nur ein "HH:MM:SS" sein kann, dann könnte er sich das
"or" hier sparen. Das ist ja letztendlich der Test, ob er wirklich das
richtige Format (eine Zeitangabe) vorliegen hat.


Gruß
Carsten

Re: strtotime bringt auf Windows-System falsche Antwort

am 07.08.2006 20:18:20 von Carsten Wiedmann

Michael Vogel schrieb:

> //Prüfung, ob im Uhrzeitfeld wirklich eine Uhrzeit steht.
> //Falls dort ein Datum steht, ist der Timestamp größer 82800
> if ((strtotime($fields['time'],0) <= 0) or (strtotime($fields['time'],0)
> > 82800)) return(array('time' => 'Die Uhrzeit ist ungültig.'));
>
> Es ist sichergestellt und getestet, dass in $fields['time'] tatsächlich
> ein
> Zahlenstring im Format "HH:MM:SS" steht.

Wie schon gesagt wurde:
Schau dann mal in der Firma, welchen Wert "strtotime($fields['time'],0)"
dort tatsächlich zurückliefert... Und welche PHP-Version läuft.

Abgesehen von einer kleinen Regex um den String auf Gültigeit zu zerlegen,
würde mir hier noch folgendes einfallen:
| //Prüfung, ob im Uhrzeitfeld wirklich eine Uhrzeit steht.
| if (false == strtotime("1970-01-02 {$fields['time']}", 0)) {
| return array('time' => 'Die Uhrzeit ist ungültig.');
| }

Gruß
Carsten

Re: strtotime bringt auf Windows-System falsche Antwort

am 08.08.2006 13:54:31 von Michael Vogel

Moin!
Carsten Wiedmann wrote:
> Schau dann mal in der Firma, welchen Wert "strtotime($fields['time'],0)=
"=20
> dort tatsächlich zurückliefert... Und welche PHP-Version läuft.

Als PHP-Version läuft 5.1.1, auf den anderen Rechnern - auf denen es kl=
appt
- läuft 5.1.4. Ich vermute jetzt erstmal darin das Problem und werde im
Firmenwiki einen entsprechenden Eintrag machen.
=20
Michael

Re: strtotime bringt auf Windows-System falsche Antwort

am 08.08.2006 18:10:20 von Carsten Wiedmann

Michael Vogel schrieb:

> Carsten Wiedmann wrote:
> > Schau dann mal in der Firma, welchen Wert
> > "strtotime($fields['time'],0)" dort tatsächlich zurückliefert... Und
> > welche PHP-Version läuft.
>
> Als PHP-Version läuft 5.1.1, auf den anderen Rechnern - auf denen es
> klappt
> - läuft 5.1.4. Ich vermute jetzt erstmal darin das Problem und werde im
> Firmenwiki einen entsprechenden Eintrag machen.

Da bist du in den Bug #36638 gestolpert. Wenn du die Prüfung so machst, wie
ich es zuvor gepostet hab, tut's auch unter 5.1.1.

Gruß
Carsten

Re: strtotime bringt auf Windows-System falsche Antwort

am 11.08.2006 10:13:36 von Michael Vogel

Moin!

Carsten Wiedmann wrote:
>=20
> Da bist du in den Bug #36638 gestolpert. Wenn du die Prüfung so machs=
t, wie=20
> ich es zuvor gepostet hab, tut's auch unter 5.1.1.

Es ist ja nicht nur mit der Prüfung erledigt, ich muss die Zeit auch nu=
tzen
und dafür benötige ich strtotime. Die Lösung mit dem Updaten ist da
einfacher und für uns auch durchaus praktikabel. Ich muss nur endlich m=
al
den Eintrag im Firmenwiki dazu machen ;-)

Michael