Seltsames Datum mit strtotime

Seltsames Datum mit strtotime

am 03.09.2006 23:10:00 von official

Hallo Gemeinde,

In einem Formular lasse ich ein Datum eingeben. Mir reicht die Überprüfung
auf Gültigkeit. Das Datum lasse ich als YYYY-MM-DD eingeben und mit
strtotime in einen timestamp umwandeln, dann überprüfe ich auf Gültigkeit
durch Vergleich mit -1.

Interessanterweise wandelt strtotime 2006-15-10, definitiv kein valides
Datum, in den timestamp vom 4. September 2006 um. Ich hätte aber gerne
die -1.

Was habe ich hier falschgemacht? Kann setlocale(LC_ALL, 'de_DE.utf8@euro');
etwas damit zu tun haben?

mfg
Christian

--
> Hm, gibt es in OjE eigentlich einen Button "Einmal zum Deppen machen"?
Er ist mit "Senden" beschriftet.
(J.Grivolla antwortet H. Gahrig in d.c.s.m.)

Re: Seltsames Datum mit strtotime

am 03.09.2006 23:39:09 von Udo Neist

Christian H. Kuhn wrote:

> Hallo Gemeinde,
>
> In einem Formular lasse ich ein Datum eingeben. Mir reicht die
> Überprüfung auf Gültigkeit. Das Datum lasse ich als YYYY-MM-DD
> eingeben und mit strtotime in einen timestamp umwandeln, dann
> überprüfe ich auf Gültigkeit durch Vergleich mit -1.
>
> Interessanterweise wandelt strtotime 2006-15-10, definitiv kein
> valides Datum, in den timestamp vom 4. September 2006 um. Ich
> hätte aber gerne die -1.
>

Ich würde das Datum eher auseinander nehmen und jede Komponente
überprüfen. Mir haben die Datumsfunktionen schon so manche
Kopfschmerzen bereitet.

Folgendes könnte dir helfen:

[codeschnipsel]

eregi("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$datum, $regs);
if (checkdate ($regs[2],$regs[3],$regs[1])) echo "Datum ist
korrekt.";

[/codeschnipsel]

Gruß
Udo

Re: Seltsames Datum mit strtotime

am 04.09.2006 00:30:58 von Gregor Kofler

Udo Neist meinte:

> Folgendes könnte dir helfen:
>

> eregi("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$datum, $regs);
> if (checkdate ($regs[2],$regs[3],$regs[1])) echo "Datum ist
> korrekt.";

Warum das antiquarische eregi? Noch dazu, wenn du es gar nicht testest?
Also eher was wie

if(eregi...)

Ansonsten wäre explode schneller und IMO übersichtlicher.


Gruß, Gregor



--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum

Re: Seltsames Datum mit strtotime

am 04.09.2006 01:35:03 von Frank Schenk

Udo Neist schrieb:
> [codeschnipsel]

Codeschnipsel findest du unter http://www.php-faq.de

Das hier entsorgst du besser schnell.

> eregi("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$datum, $regs);

ereg ist veraltet, siehe Handbuch
Prüfen tust du es auch nicht.



Frank

Re: Seltsames Datum mit strtotime

am 04.09.2006 20:15:47 von official

& dixit Christian "Ingrid" Kuhn:

> Interessanterweise wandelt strtotime 2006-15-10, definitiv kein valides
> Datum, in den timestamp vom 4. September 2006 um. Ich hätte aber gerne
> die -1.

Der Schuldige ist MySQL selbst. Aus Gründen, die ich abgestellt zu haben
glaubte (DEFAULT war CURRENT TIMESTAMP, das hab ich via phpmyadmin aber
geändert), wird, wenn nichts sinnvolles eingegeben wird, der aktuelle
Timestamp eingetragen. Ich werd mich also in der MySQL-Gruppe erkundigen,
wie ich das abstelle.

mfg
Christian

--
"5 Minuten" heisst "mindestens ne viertelstunde, wenn alles glatt
geht", aber es geht nie irgendwas glatt, und schon garnicht in ner
viertelstunde.
Frank Paulsen in dasr

Re: Seltsames Datum mit strtotime

am 04.09.2006 20:17:54 von official

& dixit Gregor Kofler:
> Udo Neist meinte:
>> eregi("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$datum, $regs);
>> if (checkdate ($regs[2],$regs[3],$regs[1])) echo "Datum ist
>> korrekt.";
>
> Ansonsten wäre explode schneller und IMO übersichtlicher.

explode war mein erster Gedanke. Aber nachdem ich jetzt schon für nen
einfachen Terminkalender bei 350 Zeilen bin, wo ich dachte, dass 50 locker
reichen, wollte ichs halt kurz halten. Und die Beschreibung von strtotime
legt ja nahe, dass kurz halten möglich sein sollte. Gut, dann halt nicht.
Danke für die Diskussion.

mfg
Christian

--
Für Windows ist mein Leben zu schön, für Linux zu kurz.
(Axel Bergander in d.r.m.)

Re: Seltsames Datum mit strtotime

am 04.09.2006 21:30:20 von Udo Neist

Frank Schenk wrote:

> Udo Neist schrieb:
>> [codeschnipsel]
>
> Codeschnipsel findest du unter http://www.php-faq.de
>
> Das hier entsorgst du besser schnell.
>
>> eregi("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$datum, $regs);
>
> ereg ist veraltet, siehe Handbuch
> Prüfen tust du es auch nicht.

Das die Prüfung fehlt, das liegt daran, das ich das aus einem
anderen Zusammenhang kopiert hatte. Laut php.net ist ereg nicht
veraltet, jedenfalls steht das nicht darin. Es gibt nur ein Verweis
auf preg_match().

Gruß
Udo

Re: Seltsames Datum mit strtotime

am 04.09.2006 21:33:24 von Udo Neist

Gregor Kofler wrote:

> Udo Neist meinte:
>
>> Folgendes könnte dir helfen:
>>
>
>> eregi("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$datum, $regs);
>> if (checkdate ($regs[2],$regs[3],$regs[1])) echo "Datum ist
>> korrekt.";
>
> Warum das antiquarische eregi? Noch dazu, wenn du es gar nicht
> testest? Also eher was wie
>
> if(eregi...)
>
> Ansonsten wäre explode schneller und IMO übersichtlicher.

Explode ist aber auch nicht das gelbe vom Ei. Explode liefert nur
ein Array zurück, ohne zuvor eine Prüfung gemacht zu haben, ob eine
gültige numerische Zeichenkette wie im Codeschnippsel vorliegt. Ein
regulärer Ausdruck kann schon an einer solchen Stelle ganz nützlich
sein. Ob hier preg_match() besser wäre, darüber könnte man
streiten, allerdings über die fehlende Prüfung leider nicht.

Gruß
Udo

Re: Seltsames Datum mit strtotime

am 04.09.2006 21:58:13 von Matthias Esken

On Mon, 04 Sep 2006 21:30:20 +0200, Udo Neist wrote:

> Das die Prüfung fehlt, das liegt daran, das ich das aus einem
> anderen Zusammenhang kopiert hatte. Laut php.net ist ereg nicht
> veraltet, jedenfalls steht das nicht darin. Es gibt nur ein Verweis
> auf preg_match().

Stimmt. De facto ist es aber so, dass mit PHP 6 die ereg-Funktionen aus dem
PHP-Kern rausfliegen werden. Folglich sollte man also die preg-Funktionen
verwenden, da diese nicht nur schneller, sondern auch zukunftssicherer
sind.

In diesem Kontext schadet auch ein Verweis auf die FAQ nicht:

8.2. Soll ich ereg() oder preg() verwenden?
http://www.php-faq.de/q/q-regexp-ereg.html

Gruß,
Matthias

Re: Seltsames Datum mit strtotime

am 04.09.2006 22:20:37 von Gregor Kofler

Udo Neist meinte:

> Explode ist aber auch nicht das gelbe vom Ei.

Sowieso. Ich erledige es auch mit preg_match(). Aber mit "ohne Prüfung"
tut es auch explode().

Gruß, Gregor


--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum

Re: Seltsames Datum mit strtotime

am 04.09.2006 22:37:42 von Carsten Wiedmann

Christian H. Kuhn schrieb:

> In einem Formular lasse ich ein Datum eingeben. Mir reicht die Überprüfung
> auf Gültigkeit. Das Datum lasse ich als YYYY-MM-DD eingeben und mit
> strtotime in einen timestamp umwandeln, dann überprüfe ich auf Gültigkeit
> durch Vergleich mit -1.


Könnte man alternativ auch so machen:
| $input = '2006-10-31';
| $result = preg_replace(
| '|(\d{4})-(\d{1,2})-(\d{1,2})|e',
| 'checkdate("\\2", "\\3", "\\1") ?
| mktime(0, 0, 0, \\2, \\3, \\1) : "-1"',
| $input
| );
| echo $result;

Wenn du keinen Timestamp hier benötigst, kannst du das mktime(...) auch
durch "1" (positiv) oder "\\1-\\2-\\3" (direktes Weiterverwenden des Datums)
ersetzten. Je nach dem.



> Interessanterweise wandelt strtotime 2006-15-10, definitiv kein valides
> Datum, in den timestamp vom 4. September 2006 um. Ich hätte aber gerne
> die -1.

Lustig :-/ Das ist mir noch gar nicht aufgefallen:
Je nach PHP 4.4.x, 5.0.x oder 5.1.x bekommt man bei
"strtotime('2006-15-10')" "1173481200" oder "1157454360" als Rückgabe.
Nur bei PHP 5.1.x gibt "strtotime('2006-15-10 00:00:00')" dann wenigstens
"false" zurück.

Woran das jetzt wieder liegt?

Gruß
Carsten

Re: Seltsames Datum mit strtotime

am 05.09.2006 00:29:12 von Niels Braczek

Udo Neist schrieb:

> Laut php.net ist ereg nicht
> veraltet, jedenfalls steht das nicht darin. Es gibt nur ein Verweis
> auf preg_match().

http://www.php.net/~derick/meeting-notes.html#move-ereg-to-p ecl

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: Seltsames Datum mit strtotime

am 05.09.2006 00:43:47 von Frank Schenk

Carsten Wiedmann schrieb:
> Könnte man alternativ auch so machen:
> | $input = '2006-10-31';
> | $result = preg_replace(
> | '|(\d{4})-(\d{1,2})-(\d{1,2})|e',
> | 'checkdate("\\2", "\\3", "\\1") ?
> | mktime(0, 0, 0, \\2, \\3, \\1) : "-1"',
> | $input
> | );
> | echo $result;

Gibt das die Code-Paralympics hier?

Webspace wird nicht mehr nach Kilobyte abgerechnet und es spricht nichts
dagegen, vernünftig lesbaren Code zu produzieren.

Frank

P.S.: Man könnte natürlich noch alles in eine Zeile hauen und nen
Obfuscator drüber laufen lassen, schaut bestimmt lustig aus.

Re: Seltsames Datum mit strtotime

am 05.09.2006 02:29:28 von Ulf Kadner

Frank Schenk wrote:

> Carsten Wiedmann schrieb:
>
>> | $input = '2006-10-31';
>> | $result = preg_replace(
>> | '|(\d{4})-(\d{1,2})-(\d{1,2})|e',
>> | 'checkdate("\\2", "\\3", "\\1") ?
>> | mktime(0, 0, 0, \\2, \\3, \\1) : "-1"',
>> | $input
>> | );
>> | echo $result;
>
>
> Gibt das die Code-Paralympics hier?
>
> Webspace wird nicht mehr nach Kilobyte abgerechnet und es spricht nichts
> dagegen, vernünftig lesbaren Code zu produzieren.

Hallo Frank!

Ich verstehe Dich in der Beziehung nicht, Das ist Code wie er sehr oft
so zur Anwendung kommt. Lesbarkeit sehr gut. (subjektiv halt)

Wie würdest Du das besser machen? Wenn Du schon meckerst :-)

Willst Du das erst über nen callback laufen lassen oder wo soll
gezaubert werden? :-x

MfG, Ulf

Re: Seltsames Datum mit strtotime

am 05.09.2006 18:06:47 von Udo Neist

Matthias Esken wrote:

> On Mon, 04 Sep 2006 21:30:20 +0200, Udo Neist wrote:
>
>> Das die Prüfung fehlt, das liegt daran, das ich das aus einem
>> anderen Zusammenhang kopiert hatte. Laut php.net ist ereg nicht
>> veraltet, jedenfalls steht das nicht darin. Es gibt nur ein
>> Verweis auf preg_match().
>
> Stimmt. De facto ist es aber so, dass mit PHP 6 die
> ereg-Funktionen aus dem PHP-Kern rausfliegen werden. Folglich
> sollte man also die preg-Funktionen verwenden, da diese nicht nur
> schneller, sondern auch zukunftssicherer sind.
>
> In diesem Kontext schadet auch ein Verweis auf die FAQ nicht:
>
> 8.2. Soll ich ereg() oder preg() verwenden?
> http://www.php-faq.de/q/q-regexp-ereg.html
>
> Gruß,
> Matthias

Thx. Ich habe mal geschaut, ob ich ereg überhaupt noch brauche, da
ich damals ein Problem mit einem Timestamp lösen musste. Bis auf
ein paar Ausnahmen brauche ich die Funktion nicht mehr und werde
für die eine andere Lösung finden. Meine eigentliche Datumsfunktion
nutzt im übrigen auch explode().

Gruß
Udo

Re: Seltsames Datum mit strtotime

am 06.09.2006 00:34:34 von Frank Schenk

Ulf Kadner schrieb:
>> Carsten Wiedmann schrieb:
>>> | $input = '2006-10-31';
>>> | $result = preg_replace(
>>> | '|(\d{4})-(\d{1,2})-(\d{1,2})|e',
>>> | 'checkdate("\\2", "\\3", "\\1") ?
>>> | mktime(0, 0, 0, \\2, \\3, \\1) : "-1"',
>>> | $input
>>> | );

> Hallo Frank!
>
> Ich verstehe Dich in der Beziehung nicht, Das ist Code wie er sehr oft
> so zur Anwendung kommt. Lesbarkeit sehr gut. (subjektiv halt)

na so:

// test value
$input = '2006-10-31';

// we have an integer value, no brackets plz
$result = -1;

// check input for valid format
if(preg_match('~(\d{4})-(\d{1,2})-(\d{1,2})~', $input, $m)){

// debug possible!
// print_r($m);

// pretty names
$day = $m[3];
$month = $m[2];
$year = $m[1];

// check if date is valid
if(check_date($month, $day, $year)){

// get timestamp
$result = mktime(0,0,0, $month, $day, $year);

// mktime ist hier problematisch weil 1970 Problem
}
}


Den Wurschtelcode da oben würd ich sofort zerlegen (bzw. eher wegwerfen
und neuschreiben).

Aber das ist eh nur eine rudimentäre Prüfung, ne halbwegs taugliche
Prüfung die nicht nur ISO Date versteht ist 3mal so lang.

Gruß, Frank

Re: Seltsames Datum mit strtotime

am 06.09.2006 11:28:29 von Ulf Kadner

Frank Schenk wrote:

> Ulf Kadner schrieb:
>> Frank Schenk wrote:
>>> Webspace wird nicht mehr nach Kilobyte abgerechnet und es spricht
>>> nichts dagegen, vernünftig lesbaren Code zu produzieren.
>> Ich verstehe Dich in der Beziehung nicht, Das ist Code wie er sehr oft
>> so zur Anwendung kommt. Lesbarkeit sehr gut. (subjektiv halt)
>
> na so:
> ...
>
> Den Wurschtelcode da oben würd ich sofort zerlegen (bzw. eher wegwerfen
> und neuschreiben).
>
> Aber das ist eh nur eine rudimentäre Prüfung, ne halbwegs taugliche
> Prüfung die nicht nur ISO Date versteht ist 3mal so lang.

Darum ging es doch garnicht!

Dein Code stellt durchaus eine programmatische Verbesserung dar.
Aber das hat nichts mit guter Lesbarkeit zu tun, sondern mit
Verbesserung der Funktionalität des Codes. Das sind meiner Ansicht nach
2 verschiedene, wenn auch eng verbundene Dinge. Ich bezog mich hier in
keiner weise auf die Funktionalität, sondern wie Du (so dachte ich
zumindest) auf die Lesbarkeit.

Da haben wir uns wohl missverstanden.

MfG, Ulf

Re: Seltsames Datum mit strtotime

am 06.09.2006 21:29:10 von Frank Schenk

Ulf Kadner schrieb:
> Dein Code stellt durchaus eine programmatische Verbesserung dar.
> Aber das hat nichts mit guter Lesbarkeit zu tun, sondern mit
> Verbesserung der Funktionalität des Codes. Das sind meiner Ansicht nach
> 2 verschiedene, wenn auch eng verbundene Dinge. Ich bezog mich hier in
> keiner weise auf die Funktionalität, sondern wie Du (so dachte ich
> zumindest) auf die Lesbarkeit.
>
> Da haben wir uns wohl missverstanden.

Mitnichten lieber Ulf, ich finde meinen Code weitaus besser lesbar,
natürlich halte ich mich nicht immer dran aber meistens schachtele ich
nicht mehr als 2 Funktionsaufrufe (schon garnicht per
preg_replace-eval-etc).


gruß, Frank