Waarom komt strtotime ('a') terug in de tijd?

Ik loop door een CSV-bestand in PHP 5.3 en controleer op datums. Ik heb strtotime() gebruikt en het heeft goed gewerkt, behalve één veld dat ik ofwel een 1 of 2 char-code heb.

strtotime() op een enkele char-code lijkt te handelen zoals ik nu vraag (), maar als de code 2 tekens is, mislukt deze, zoals ik zou verwachten.

Wat begrijp ik niet over de manier waarop strtotime() werkt?

4
@Michael: Wat is jouw versie van PHP?
toegevoegd de auteur BoltClock, de bron
Ik kan dat gedrag niet reproduceren
toegevoegd de auteur Michael Berkowski, de bron
var_dump (strtotime ('a')); produceert bool (false)
toegevoegd de auteur Michael Berkowski, de bron
Wacht - de eerste server die ik heb getest, draait nog steeds 5.1.6. Mijn 5.3.8-machine produceert het resultaat
toegevoegd de auteur Michael Berkowski, de bron
@Michael: Op mijn testsysteem (Win7x64/PHP 5.3.4) produceert het een tijdstempel.
toegevoegd de auteur Jon, de bron
codepad.org/uJkeLD2W levert gepaste resultaten op.
toegevoegd de auteur George Cummins, de bron

5 antwoord

Neem een ​​kijkje op http://www.php.net/manual/en /datetime.formats.time.php tijdnotaties. Het lijkt erop dat 'a' een tijdzone is. Het is misschien een vergissing dat 'a' werkt en het lost iets anders op, maar dat is tenminste de verklaring.

5
toegevoegd
toegevoegd de auteur nachito, de bron
Dit lijkt de boosdoener te zijn als @Johan B.W. de Vries toonde. Dit is gewoon niet wat ik verwachtte.
toegevoegd de auteur ursasmar, de bron

strtotime doet in principe het het beste om te interpreteren wat het in jouw tekst betekent, ik geloof niet dat je er op bepaalde strings op kunt vertrouwen.

Voorbeeld:

<?php

echo 'Now: ' . date('c') . PHP_EOL;
echo PHP_EOL;
for($c = 'A'; $c <= 'z'; $c = chr(ord($c) + 1)) {
    echo $c . ' - ' . date('c', strtotime($c)) . PHP_EOL;
}

Als ik de uitvoer naast http://www.timeanddate.com/library/abbreviations zet/timezones/militair/, ik kan alleen de conclusie van @tandu ondersteunen dat het het interpreteert als tijdzones (inclusief de J-letter die resulteert in een ongeldige datum).

Het is een beste poging, denk ik. Als je een probleem hebt met de manier waarop het met losse letters omgaat, voeg dan een check-up toe. Niet echt leuk, maar dat is wat je krijgt als je onregelmatige gegevens probeert te analyseren.

2
toegevoegd
Ik heb een controle toegevoegd voor een minimale tekenreekslengte en deze werkt nu.
toegevoegd de auteur ursasmar, de bron

Nou, PHP doet duidelijk IETS DOEN met single-char tijdstempels in strtotime ():

running:

<?php

$now = time();
foreach(range('a', 'z') as $char) {
   $t = strtotime($char, $now);
   echo "$now ($char) -> $t {", ($now - $t), "} [", date($char, $now), "]\n";
}

geeft me:

1319739230 (a) -> 1319717630 {21600} [pm]
1319739230 (b) -> 1319714030 {25200} [b]
1319739230 (c) -> 1319710430 {28800} [2011-10-27T13:13:50-05:00]
1319739230 (d) -> 1319706830 {32400} [27]
1319739230 (e) -> 1319703230 {36000} [America/Chicago]
1319739230 (f) -> 1319699630 {39600} [f]
1319739230 (g) -> 1319696030 {43200} [1]
1319739230 (h) -> 1319692430 {46800} [01]
1319739230 (i) -> 1319688830 {50400} [13]
1319739230 (j) ->  {1319739230} [27]
1319739230 (k) -> 1319685230 {54000} [k]
1319739230 (l) -> 1319681630 {57600} [Thursday]
1319739230 (m) -> 1319678030 {61200} [10]
1319739230 (n) -> 1319724830 {14400} [10]
1319739230 (o) -> 1319728430 {10800} [2011]
1319739230 (p) -> 1319732030 {7200} [p]
1319739230 (q) -> 1319735630 {3600} [q]
1319739230 (r) -> 1319739230 {0} [Thu, 27 Oct 2011 13:13:50 -0500]
1319739230 (s) -> 1319742830 {-3600} [50]
1319739230 (t) -> 1319746430 {-7200} [31]
1319739230 (u) -> 1319750030 {-10800} [000000]
1319739230 (v) -> 1319753630 {-14400} [v]
1319739230 (w) -> 1319757230 {-18000} [4]
1319739230 (x) -> 1319760830 {-21600} [x]
1319739230 (y) -> 1319764430 {-25200} [11]
1319739230 (z) -> 1319721230 {18000} [299]

Heel vreemd dat 'j' voor een personage er helemaal niet in slaagt om iets terug te geven, maar de rest komt IETS terug.

0
toegevoegd
echo ((time() - strtotime('a'))/(60 * 60));

Dit zou gelijk moeten zijn aan je huidige tijdzone aangezien PHP "a" interpreteert als de TZ.

0
toegevoegd

Ik heb getest met verschillende enkele tekens en het lijkt op een tijdstempel voor de huidige tijd in de tijdzone die wordt aangegeven door het enkele teken. Strtotime ("z") komt naar voren als een huidige tijdstempel voor de Zulu-tijd, vier uur voor mij, wat correct is. Er is geen "J" voor militaire tijdzones.

0
toegevoegd