Domanda

Sto cercando una funzione identica a DateTime :: createFromFormat ma ho bisogno di lavorare in un ambiente che esegue una versione di PHP che è più vecchio di V5.3. Fondamentalmente ho bisogno di fornire un formato, come usereste con la Date () funzione e poi ho bisogno di analizzare / validare una stringa contro quel formato, e restituire un timestamp se la stringa è formattato correttamente e la data.

Qualcuno sa dove posso trovare qualcosa di simile, o devo scrivere io stesso?

Di nuovo, questo deve lavorare con un formato specifico, fornito come argomento. Il formato potrebbe essere qualsiasi cosa, quindi non c'è alcuna garanzia che posso usare appena strtotime () .

È stato utile?

Soluzione

DateTime::createFromFormat e date_parse_from_format sono stati aggiunti in PHP 5.3 perché c'era una forte domanda di tale caratteristica, in particolare da sviluppatori che hanno codice per gli utenti che non utilizzano US formati di data / ora.


Prima di questi, si doveva sviluppare una funzione specifica per analizzare il formato che si stava utilizzando; con PHP <5.3, quello che è generalmente fatto è:

  • Decidere quale formato sarà accettato dall'applicazione
  • Visualizza qualche messaggio che dice qualcosa del tipo "l'input dovrebbe essere JJ / MM / AAAA" (francese per GG / MM / AAAA)
  • Verificare che l'ingresso è OK, per quanto riguarda questo formato
  • E analizzarlo per convertirlo in una data / ora che PHP può capire.

Il che significa applicazioni e sviluppatori in genere non hanno permesso per che molti formati, come ogni formato ha significato una diversa convalida additionnal + funzione di parsing.


Se si ha realmente bisogno che tipo di funzione, che permette di qualsiasi formato possibile, temo che ti tipo di dover scrivere da soli: - (

Forse dare un'occhiata a delle fonti di date_parse_from_format potrebbe aiutare, se si capisce il codice C? Dovrebbe essere in qualcosa di simile ext/date/php_date.c - ma non sembra essere così semplice: è il richiamo della funzione timelib_parse_from_format, che è definito nella ext/data/lib/parse_date.c, e non sembra che amichevole ^^

Altri suggerimenti

È possibile utilizzare la classe Zend_Date da Zend Framework: http: // quadro. zend.com/manual/en/zend.date.html

$date = new Zend_Date($string, $format);
$timestamp = $date->get();

È possibile utilizzare strptime() - sta usando formato strftime() . Un po 'diverso rispetto a date() formato ma lo fa quasi le stesse cose.

function createFromFormat($strptimeFormat, $date) {
    $date = strptime($date, $strptimeFormat);
    $date['tm_year'] += 1900;
    $date['tm_mon']++;
    $timestamp = mktime($date['tm_hour'], $date['tm_min'], $date['tm_sec'], $date['tm_mon'], $date['tm_mday'], $date['tm_year']);
    return new DateTime('@'. $timestamp);
}

Per la versione di PHP prima di 5.3 Io uso questa funzione soffietto per ottenere DateTime stringhe forma oggetto formattati come 'DD.MM.YYYY'.

function ParseForDateTimeValue ($strText)
{
    if ($strText != "")
    {
        if (ereg("^([0-9]{1,2})[/\.]\s*([0-9]{1,2})[/\.]\s*([0-9]{2,4})$",$strText,$arr_parts)) {

            $month = ltrim($arr_parts[2], '0');
            $day = ltrim($arr_parts[1], '0');
            $year = $arr_parts[3];

            if (checkdate($month, $day, $year)) {
               return new DateTime(date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day, $year));
            }
        }
    }
    return NULL;
}
  • Prima convalidare se l'input è corretto.
  • Quindi estrarre mese, giorno e anno
  • Usa checkdate per convalidare la data.
  • Convertire al timestamp e passarlo al contructor di DateTime e restituirlo.

È possibile creare un timestamp e poi eseguirlo tramite data .. per creare il timestamp si può fare qualche explode sulla corda si ottiene ..

$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "Tomorrow is ".date("Y/m/d", $tomorrow);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top