2010-02-05 7 views
7

Ho usato il metodo strtotime() di PHP per accettare un campo data su un modulo. Mi piace quanto sia potente, in che modo accetterà "Domani", "Giovedi prossimo" o (presumibilmente) qualsiasi rappresentazione di data e convertirla nel timestamp di Unix.PHP strtotime() sembra che si aspetti un formato Euro

Sta funzionando benissimo, fino a ieri. Qualcuno ha inserito "2-4-10" e invece di registrare il 4 febbraio 2010, ha registrato il 10 aprile 2002! Quindi si aspettava Y-M-D invece di M-D-Y.

Ho pensato che forse il problema riguardava solo un anno a 2 cifre, quindi abbiamo provato di nuovo con "2-4-2010". Quello registrato il 2 aprile 2010! A quel punto non capisco cosa stia facendo lo strtotime(). PHP.net dice che si aspetta un formato di data inglese americano. Perché allora assumerebbe D-M-Y?

C'è un modo per aggirare questo? O devo smettere di usare strtotime()?

Nota: Ho appena fatto un test. Quando usi le barre invece di trattini/trattini, funziona bene, anche con 2/4/10. Perché diavolo importa? E se è tutto, dovrei semplicemente eseguire str_replace ("-", "/", $ input) sull'input del form prima di passarlo a strtotime()?

+1

Sì, tentare di normalizzare la data in qualche modo prima di elaborarlo con strtotime mi sembra una buona idea. – JAL

+0

Attendi fino a quando non tenti di usare strtotime per analizzare * volte *, quindi ti divertirai un mondo. (Pensa a fusi orari, ora legale, ecc.) –

risposta

7

L'- indica una data ISO:

03-02-01 => 1. february 2003 (ISO) 
01.02.03 => 1. february 2003 (European) 
02/01/03 => 1. february 2003 (US) 
6

Il comportamento di strtotime() si basa in gran parte sul GNU date input formati spec. Per quanto potente, non dovrebbe aspettarsi di leggere le menti. Permettere l'immissione di dati in formato libero richiede problemi perpetui.

+0

+1 Molto importante per l'ultima frase. – alex

1

Ho avuto questo problema e l'ho risolto facendo esattamente ciò che hai suggerito: fai un str_replace nella data immessa dall'utente per sostituire i trattini con le barre. Ciò impedisce a strtotime di utilizzare una data ISO e risolve il problema.

0

strtotime è per sua natura sfocata, quindi non si può presumere che farà sempre quello che vuoi. Se si inserisce 2010-04-02, ci si aspetterebbe che restituisca il 2 aprile 2010, che è ciò che sta tentando di fare. Esecuzione di uno str_replace da trattini a barre potrebbe significare che le persone che entrano in quel formato ottengono la data sbagliata.

Se si utilizza PHP 5.3 o versione successiva, considerare date_parse_from_format() o per PHP 5.1 e versioni successive su Unix considerare strptime(). Entrambe le funzioni assumono un formato, quindi rimuovi le potenziali ambiguità (se comunichi agli utenti il ​​formato che ti aspetti - se stai gestendo un sito internazionale e hai una data casella etichettata in cui l'utente inserisce il 2/4/2010 in allora non c'è modo di sapere quale sia la data prevista).

Problemi correlati