Pergunta

Estou procurando uma função idêntica a DateTime :: createFromFormat Mas preciso que ele funcione em um ambiente executando uma versão do PHP que é mais antiga que a v5.3. Basicamente, preciso fornecer um formato, como você usaria com o Encontro() Função, e então eu preciso analisar/validar uma string nesse formato e retornar um registro de data e hora se a string for formatada corretamente e uma data válida.

Alguém sabe onde posso encontrar algo assim, ou tenho que escrever eu mesmo?

Novamente, isso deve funcionar com um formato específico, fornecido como argumento. O formato pode ser qualquer coisa, então não há garantia de que eu possa usar strtotime ().

Foi útil?

Solução

DateTime::createFromFormat e date_parse_from_format foram adicionados no PHP 5.3 porque havia uma alta demanda por esse recurso, especialmente de desenvolvedores que codificam os usuários que não nos usam formatos de data/hora.


Antes disso, você tinha que desenvolver uma função específica para analisar o formato que estava usando; Com PHP <5.3, o que geralmente é feito é:

  • Decida qual formato será aceito pelo aplicativo
  • Exibir alguma mensagem dizendo algo como "Sua opinião deve ser JJ/MM/AAAA" (Francês para dd/mm/aaaa)
  • Verifique se a entrada está ok, em relação a esse formato
  • E analisá -lo para convertê -lo em uma data/hora que o PHP pode entender.

O que significa que aplicativos e desenvolvedores geralmente não permitiam tantos formatos, pois cada formato significava uma validação adicional diferente+função de análise.


Se você realmente precisa desse tipo de função, isso permite qualquer formato possível, receio que você tenha que escrevê-lo :-(

Talvez dando uma olhada nas fontes de date_parse_from_format poderia ajudar, se você entender o código C? Deve estar em algo como ext/date/php_date.c - mas não parece ser tão simples: está chamando o timelib_parse_from_format função, que é definida em ext/data/lib/parse_date.c, e não parece tão amigável ^^

Outras dicas

Você pode usar a classe Zend_date da Zend Framework: http://framework.zend.com/manual/en/zend.date.html

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

Você pode usar strptime() - está usando strftime() formato. Um pouco diferente em comparação com date() formato, mas faz quase as mesmas coisas.

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);
}

Para a versão PHP antes de 5.3, eu uso esta função abaixo para obter Data hora Strings de forma de objeto formadas como '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;
}
  • Primeiro valide se a entrada estiver correta.
  • Em seguida, extraia mês, dia e ano
  • Use CheckDate para validar a data.
  • Converta -o para o registro de data e hora e passe para o Contutor do DateTime e retorne -o.

Você pode criar um timestamp e depois execute -o até a data .. para criar o timestamp você pode fazer alguns explode na string que você recebe ..

$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "Tomorrow is ".date("Y/m/d", $tomorrow);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top