Estou recebendo uma sequência de datas de uma API e está formatada como yyyy-mm-dd
.
No momento, estou usando um regex para validar o formato da string, que funciona bem, mas posso ver alguns casos em que poderia ser um formato correto de acordo com a string, mas na verdade uma data inválida. ou seja 2013-13-01
, por exemplo.
Existe uma maneira melhor no PHP de pegar uma string como 2013-13-01
e dizer se é uma data válida ou não para o formato yyyy-mm-dd
?
Respostas:
Você pode usar
DateTime
classe para essa finalidade:[ Função retirada desta resposta . Também no php.net . Originalmente escrito por Glavić . ]
Casos de teste:
Demo!
fonte
strtotime
obter o timestamp unix edate('Y-m-d', $t)
obter a data da string. Então você as compara exatamente como esta resposta.strtotime
, mas para formatos fora do padrão questrtotime
não reconhecem, você precisará de outra solução. E para o suporte à versão 5.2 do php parado em janeiro de 2011, o suporte para 5.3 parou em agosto de 2014.var_dump( validateDate('2012-2-9'));
'Y-n-j'
@reignsly.$d
não será falso se você der uma data que tenha transbordado partes, como no 13º mês (13 2013/2013). Mas isso realmente depende do que você quer. Se você precisa, por exemplo,validateDate('2015-55-66')
ser válido, sim, você só precisa verificar se$d
é objeto ou não.Determinar se alguma sequência é uma data
fonte
yyyy-mm-dd
.2015-02-30
como uma data válida, porque quando o dia indicado é maior que o número de dias no mês especificado (ou negativo), o php passa para o próximo mês. Como a data é garantida no formato,yyyy-mm-dd
isso pode ser corrigido alterando o retorno parareturn (bool)strtotime($myDateString) && date("Y-m-d", strtotime($myDateString)) == $myDateString;
.(bool)strtotime('s')
verdade?$myDateString = str_replace("/", '-', $myDateString);
antes do retorno, se a seqüência de data contém barras (/) como: - dd / mm / aaaaUse de maneira simples com a função pré-construída php:
Teste
fonte
if
para retornar simplesmentetrue
oufalse
, retorne o teste em si.return sizeof($tmpDate) == 3 && checkdate($tmpDate[1]...
2
,20
,202
,2020
ou mesmo se o ano é20201
- ele retorna true de cada vez.Determinar se a string é uma data, mesmo que a string seja um formato não padrão
(strtotime não aceita nenhum formato personalizado)
fonte
if
para retornar simplesmentetrue
oufalse
, retorne o teste em si.Essa opção não é apenas simples, mas também aceita quase todos os formatos, embora com formatos fora do padrão possa ser buggy.
fonte
202
retorna um número negativo - que ainda passa no teste.Você também pode Analisar a data da data do mês e do ano e, em seguida, pode usar a função PHP
checkdate()
que você pode ler aqui: http://php.net/manual/en/function.checkdate.phpVocê também pode tentar este:
fonte
A maneira mais fácil de verificar se a data especificada é válida provavelmente a converte em unixtime usando
strtotime
, formatando para o formato da data especificada e comparando-a:function isValidDate($date) { return date('Y-m-d', strtotime($date)) === $date; }
É claro que você pode usar expressões regulares para verificar a validade, mas será limitado a um determinado formato, sempre que precisar editá-lo para satisfazer outros formatos, além de ser mais do que necessário. As funções integradas são a melhor maneira (na maioria dos casos) de realizar trabalhos.
fonte
checkdate()
- mas estou descobrindo que a data da verificação falha se o ano tiver QUALQUER valor:2, 20, 202, 2020, 20201
- todos retornam verdadeiros. Eu estou indo com sua solução!De acordo com a resposta de cl-sah, mas isso soa melhor, mais curto ...
Teste
fonte
count($tempDate) === 3
emboraEu tenho uma coisa que, mesmo com PHP, gosto de encontrar soluções funcionais . Então, por exemplo, a resposta dada por @migli é realmente boa, altamente flexível e elegante.
Mas há um problema: e se você precisar validar várias seqüências de caracteres DateTime com o mesmo formato? Você teria que repetir o formato em todo o lugar, o que vai contra o princípio DRY . Poderíamos colocar o formato em uma constante, mas ainda assim, teríamos que passar a constante como argumento para cada chamada de função.
Mas não tema mais! Podemos usar curry em nosso socorro! O PHP não torna essa tarefa agradável, mas ainda é possível implementar o currying com o PHP:
Então, o que acabamos de fazer? Basicamente, envolvemos o corpo da função em um anônimo e retornamos essa função. Podemos chamar a função de validação assim:
Sim, não é uma grande diferença ... mas o verdadeiro poder vem do função parcialmente aplicada , possibilitada pelo currying:
Programação funcional FTW!
fonte
Receio que a solução mais votada ( https://stackoverflow.com/a/19271434/3283279 ) não esteja funcionando corretamente. O quarto caso de teste (var_dump (validateDate ('2012-2-25')); // false) está errado. A data está correta, porque corresponde ao formato - o m permite um mês com ou sem zero à esquerda (consulte: http://php.net/manual/en/datetime.createfromformat.php ). Portanto, uma data 2012-2-25 está no formato Ymd e o caso de teste deve ser verdadeiro, não falso.
Acredito que a melhor solução é testar o possível erro da seguinte maneira:
fonte
Que tal este?
Simplesmente usamos um bloco try-catch.
Essa abordagem não se limita a apenas um formato de data / hora e você não precisa definir nenhuma função.
fonte
'0000-00-00 00:00:00'
é um valor válido de data e hora. É apenas o primeiro o valor. No entanto, a propriedade date do objeto datetime será'-0001-11-30 00:00:00'
.Solução Regex testada:
Isso retornará nulo se a data for inválida ou não estiver no formato aaaa-mm-dd, caso contrário, retornará a data.
fonte
Valide com a função checkdate :
fonte
fonte
fonte
Faça uma tentativa:
fonte