Estou tentando verificar se as datas inseridas pelos usuários finais estão no AAAA-MM-DD. Regex nunca foi meu ponto forte, continuo recebendo um valor de retorno falso para preg_match () que configurei.
Portanto, estou assumindo que baguncei a regex, detalhada abaixo.
$date="2012-09-12";
if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
{
return true;
}else{
return false;
}
Alguma ideia?
php
regex
date-format
cosmicsafari
fonte
fonte
date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";
ou PHPcheckdate ( int $month , int $day , int $year )
.Respostas:
Experimente isso.
fonte
return (bool)preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date);
É provavelmente melhor usar outro mecanismo para isso.
A solução moderna, com
DateTime
:Isso valida a entrada também:
$dt !== false
garante que a data possa ser analisada com o formato especificado e oarray_sum
truque é uma maneira concisa de garantir que o PHP não fez "mudança de mês" (por exemplo, considere que 32 de janeiro é 1 de fevereiro). VejaDateTime::getLastErrors()
para mais informações.Solução da velha escola com
explode
echeckdate
:Isso valida que a entrada também é uma data válida. Você pode fazer isso com uma regex, é claro, mas será mais complicado - e 29 de fevereiro não pode ser validado com uma regex.
A desvantagem dessa abordagem é que você deve ter muito cuidado para rejeitar todas as entradas "ruins" possíveis e, ao mesmo tempo, não emitir um aviso em nenhuma circunstância. Veja como:
explode
está limitado a retornar 3 tokens (de modo que se a entrada for "1-2-3-4",$d
se tornará "3-4")ctype_digit
é usado para garantir que a entrada não contenha caracteres não numéricos (além dos travessões)array_pad
é usado (com um valor padrão que fará comcheckdate
que falhe) para garantir que elementos suficientes sejam retornados para que se a entrada for "1-2"list()
não emita um avisofonte
DateTime
e nunca ouvi falarcheckdate
... que vergonha.DateTime
também pode fazer isso. Acabei de definir a resposta, dê uma olhada novamente se quiser.getLastErrors
?aaaa-mm-dd:
/^((((19|[2-9]\d)\d{2})\-(0[13578]|1[02])\-(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\-(0[13456789]|1[012])\-(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\-02\-(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\-02\-29))$/g
aaaa / mm / dd:
/^((((19|[2-9]\d)\d{2})\/(0[13578]|1[02])\/(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\/(0[13456789]|1[012])\/(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\/02\/(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\/02\/29))$/g
mm-dd-aaaa:
/^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
mm / dd / aaaa:
/^(((0[13578]|1[02])\/(0[1-9]|[12]\d|3[01])\/((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\/(0[1-9]|[12]\d|30)\/((19|[2-9]\d)\d{2}))|(02\/(0[1-9]|1\d|2[0-8])\/((19|[2-9]\d)\d{2}))|(02\/29\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
dd / mm / aaaa:
/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
dd-mm-aaaa:
/^(((0[1-9]|[12]\d|3[01])\-(0[13578]|1[02])\-((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\-(0[13456789]|1[012])\-((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\-02\-((19|[2-9]\d)\d{2}))|(29\-02\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
fonte
Critério:
Cada ano divisível por 4 é um ano bissexto, exceto quando é divisível por 100, a menos que seja divisível por 400. Então:
Fevereiro tem 29 dias em um ano bissexto e 28 dias quando não é um ano bissexto
30 dias em abril, junho, setembro e novembro
31 dias em janeiro, março, maio, julho, agosto, outubro e dezembro
Teste:
As seguintes datas devem passar na validação:
As seguintes datas devem falhar na validação:
Alcance:
Vamos testar as datas de 1º de janeiro de 1000 a 31 de dezembro de 2999. Tecnicamente, o calendário gregoriano usado atualmente só entrou em uso em 1753 para o Império Britânico e em vários anos de 1600 para países da Europa, mas não vou se preocupe com isso.
Regex para testar em um ano bissexto:
Os anos divisíveis por 400:
Os anos são divisíveis por 4:
Os anos divisíveis por 100:
Não divisível por 100:
Os anos divisíveis por 100, mas não por 400:
Divisível por 4, mas não por 100:
Os anos bissextos:
Não divisível por 4:
Não é um ano bissexto:
Mês e dia válidos, exceto fevereiro (MM-DD):
Fevereiro com 28 dias:
Fevereiro com 29 dias:
Data válida:
Então, você tem uma regex para datas entre 1º de janeiro de 1000 e 31 de dezembro de 2999 no formato AAAA-MM-DD.
Suspeito que pode ser um pouco abreviado, mas deixarei isso para outra pessoa.
Isso corresponderá a todas as datas válidas. Se você quiser que seja válido apenas quando contiver apenas uma data e nada mais, envolva-o
^( )$
assim:Se você quiser uma entrada de data opcional (ou seja, pode estar em branco ou uma data válida), adicione
^$|
no início, assim:fonte
Você pode fazer desta forma:
mas é melhor você usar este:
neste caso, você obterá um objeto que é muito mais fácil de usar do que apenas cordas.
fonte
0175-44-19927
vai passar.Eu sei que esta é uma questão antiga. Mas acho que tenho uma boa solução.
Você pode experimentá-lo. Se você alterar a data para 21/02/2016, o eco será falso. E se você alterar o formato depois disso para dmY, o eco será verdadeiro.
Com esse código fácil, você deve ser capaz de verificar qual formato de data é usado sem verificar pelo regex.
Talvez haja uma pessoa que irá testá-lo em todos os casos. Mas acho que minha ideia é geralmente válida. Para mim, parece lógico.
fonte
Você pode usar um preg_match com uma função checkdate php
fonte
preg_match precisa de um / ou outro caractere como delimitador.
você também deve verificar a validade dessa data para que não termine com algo como 9999-19-38
fonte
Você também pode fazer assim:
Isso não apenas verificará o formato, mas também a validade da própria data, pois
DateTime
criará apenas datas válidas e isso precisa corresponder à entrada.fonte
você pode usar
fonte
Verifique e valide a
YYYY-MM-DD
data em uma instrução de linhaO resultado será:
Dia e mês sem zero à esquerda são permitidos. Se você não quiser permitir isso, a regexp deve ser:
fonte
Se você quiser combinar esse tipo de data, use:
fonte
Isso deve informar se o formato é válido e se a data de entrada é válida.
fonte
Se for de alguma ajuda, aqui está uma regex para o formato jnY (o ano deve ser maior que 2018):
fonte
fonte
Provavelmente útil para alguém:
fonte
'1996-11-31 24:00'); // true
, realmente? Além disso, às vezes há 61 segundos em um minuto, consulte: en.wikipedia.org/wiki/Leap_secondFunção para validar o formato de data genérico:
Exemplo de execução:
fonte
Tudo depende de quão restrita você deseja que esta função seja. Por exemplo, se você não quiser permitir meses acima de 12 e dias acima de 31 (não dependendo do mês, isso exigiria escrever lógica de data), pode se tornar muito complicado:
Pessoalmente, eu só escolheria:
/^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/
fonte
0[1-9]|1[0-2]
corresponde ao mês 01-12 e ao0[1-9]|[12][0-9]|3[01]
dia 01-31.Para trabalhar com datas em php, você deve seguir o padrão php para que a regex fornecida garanta que você tenha uma data válida que possa operar com PHP.
fonte
1980-01-01
mas será compatível2100-02-29
Este método pode ser útil para validar datas em PHP. O método atual é para o formato mm / dd / aaaa. Você deve atualizar a sequência de parâmetros em data de verificação de acordo com seu formato e delimitador em explodir .
fonte
[Se você usa Symfony 4.1.2, tente isso] [1]
fonte
Do Laravel 5.7 e formato de data, ou seja: 31/12/2019
fonte
Eu estava pesquisando "como validar data" e encontrei esta solução, é antigo, mas vou compartilhar abaixo o método que pode ser usado para validar data em php,
fonte