Estoy tratando de verificar que las fechas ingresadas por los usuarios finales estén en YYYY-MM-DD. Regex nunca ha sido mi punto fuerte, sigo obteniendo un valor de retorno falso para preg_match () que he configurado.
Así que supongo que he hecho un lío con la expresión regular, que se detalla a continuación.
$date="2012-09-12";
if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
{
return true;
}else{
return false;
}
¿Alguna idea?
php
regex
date-format
safari cósmico
fuente
fuente
date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";
o PHPcheckdate ( int $month , int $day , int $year )
.Respuestas:
Prueba esto.
fuente
return (bool)preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date);
Probablemente sea mejor usar otro mecanismo para esto.
La solución moderna, con
DateTime
:Esto también valida la entrada:
$dt !== false
asegura que la fecha se pueda analizar con el formato especificado y elarray_sum
truco es una forma concisa de asegurar que PHP no hizo "cambios de mes" (por ejemplo, considere que el 32 de enero es el 1 de febrero). ConsulteDateTime::getLastErrors()
para obtener más información.Solución de la vieja escuela con
explode
ycheckdate
:Esto valida que la entrada también sea una fecha válida. Puede hacer eso con una expresión regular, por supuesto, pero será más complicado, y el 29 de febrero no se puede validar con una expresión regular en absoluto.
El inconveniente de este enfoque es que hay que tener mucho cuidado de rechazar todas las posibles entradas "malas" sin emitir un aviso bajo ninguna circunstancia. Así es cómo:
explode
está limitado a devolver 3 tokens (de modo que si la entrada es "1-2-3-4",$d
se convertirá en "3-4")ctype_digit
se utiliza para asegurarse de que la entrada no contenga ningún carácter no numérico (aparte de los guiones)array_pad
se utiliza (con un valor predeterminado que harácheckdate
que falle) para asegurarse de que se devuelvan suficientes elementos para que si la entrada es "1-2"list()
no se emita un avisofuente
DateTime
y nunca escuché sobrecheckdate
... lástima de mí.DateTime
también puede hacer esto. Acabo de terminar de dar cuerpo a la respuesta, échale un vistazo de nuevo si quieres.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
fuente
Criterios:
Cada año divisible por 4 es un año bisiesto, excepto cuando es divisible por 100 a menos que sea divisible por 400. Entonces:
Febrero tiene 29 días en un año bisiesto y 28 cuando no es un año bisiesto
30 días en abril, junio, septiembre y noviembre
31 días en enero, marzo, mayo, julio, agosto, octubre y diciembre
Prueba:
Las siguientes fechas deben pasar la validación:
Las siguientes fechas deberían fallar en la validación:
Rango:
Probaremos fechas desde el 1 de enero de 1000 hasta el 31 de diciembre de 2999. Técnicamente, el calendario gregoriano que se usa actualmente solo entró en uso en 1753 para el Imperio Británico y en varios años en el siglo XVII para países de Europa, pero no voy a preocuparse por eso.
Regex para probar durante un año bisiesto:
Los años divisibles por 400:
Los años divisibles por 4:
Los años divisibles por 100:
No divisible por 100:
Los años divisibles por 100 pero no por 400:
Divisible por 4 pero no por 100:
Los años bisiestos:
No divisible por 4:
No es un año bisiesto:
Mes y día válidos excepto febrero (MM-DD):
Febrero con 28 días:
Febrero con 29 días:
Fecha válida:
Ahí lo tiene una expresión regular para las fechas entre el 1 de enero de 1000 y el 31 de diciembre de 2999 en formato AAAA-MM-DD.
Sospecho que se puede acortar un poco, pero se lo dejo a otra persona.
Eso coincidirá con todas las fechas válidas. Si desea que solo sea válido cuando contenga solo una fecha y nada más, envuélvalo
^( )$
así:Si lo desea para una entrada de fecha opcional (es decir, puede estar en blanco o una fecha válida), agregue
^$|
al principio, así:fuente
Puedes hacerlo de esta manera:
pero será mejor que uses este:
en este caso, obtendrá un objeto que es mucho más fácil de usar que solo cadenas.
fuente
0175-44-19927
pasará.Sé que esta es una vieja pregunta. Pero creo que tengo una buena solución.
Puedes probarlo. Si cambia la fecha al 21.02.2016, el eco es falso. Y si cambia el formato después de eso a dmY, el eco es verdadero.
Con este código fácil, debería poder verificar qué formato de fecha se usa sin verificarlo con la expresión regular.
Quizás haya una persona que lo pruebe en cada caso. Pero creo que mi idea es válida en general. A mi me parece lógico.
fuente
Puede usar preg_match con una función php checkdate
fuente
preg_match necesita un / u otro carácter como delimitador.
también debe verificar la validez de esa fecha para que no termine con algo como 9999-19-38
fuente
También puedes hacerlo así:
Esto no solo verificará el formato, sino también la validez de la fecha propia, ya
DateTime
que solo creará fechas válidas y esto debe coincidir con la entrada.fuente
puedes usar
fuente
Verificar y validar la
YYYY-MM-DD
fecha en una declaración de líneaLa salida será:
Se permiten el día y el mes sin cero a la izquierda. Si no desea permitir esto, la expresión regular debería ser:
fuente
Si desea hacer coincidir ese tipo de fecha, use:
fuente
Esto debería decirle si el formato es válido y si la fecha de entrada es válida.
fuente
Si es de alguna ayuda, aquí hay una expresión regular para el formato jnY (el año debe ser mayor que 2018):
fuente
fuente
Probablemente útil para alguien:
fuente
'1996-11-31 24:00'); // true
, ¿De Verdad? Además, a veces hay 61 segundos en un minuto, ver: en.wikipedia.org/wiki/Leap_secondFunción para validar formato de fecha genérico:
Ejemplo de ejecución:
fuente
Todo depende de cuán estricta quieras que sea esta función. Por ejemplo, si no desea permitir meses por encima de 12 y días por encima de 31 (sin depender del mes, eso requeriría escribir una lógica de fecha), podría volverse bastante complicado:
Personalmente, solo iría por:
/^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/
fuente
0[1-9]|1[0-2]
coincide con el mes 01-12 y0[1-9]|[12][0-9]|3[01]
coincide con el día 01-31.Para trabajar con fechas en php, debe seguir el estándar php para que la expresión regular dada le asegure que tiene una fecha válida que pueda operar con PHP.
fuente
1980-01-01
pero coincidirá2100-02-29
Este método puede ser útil para validar la fecha en PHP. El método actual es para el formato mm / dd / aaaa. Debe actualizar la secuencia de parámetros en la fecha de verificación según su formato y delimitador en explosión .
fuente
[Si usa Symfony 4.1.2, intente esto] [1]
fuente
Desde Laravel 5.7 y formato de fecha, es decir: 31/12/2019
fuente
Estaba buscando "cómo validar la fecha" y encontré esta solución. Es antiguo, pero compartiré el siguiente método que se puede usar para validar la fecha en php.
fuente