yyyy validate validar valid preg_match is_date fecha check php regex date-format

validate - preg_match datetime php



PHP Regex para verificar la fecha está en formato YYYY-MM-DD (16)

Este método puede ser útil para validar la fecha en PHP. El método actual es para el formato mm / dd / aaaa. checkdate actualizar la secuencia de parámetros en checkdate de checkdate según su formato y delimitador en explode .

function isValidDate($dt) { $dtArr = explode(''/'', $dt); if (!empty($dtArr[0]) && !empty($dtArr[1]) && !empty($dtArr[2])) { return checkdate((int) $dtArr[0], (int) $dtArr[1], (int) $dtArr[2]); } else { return false; } }

Estoy tratando de verificar que las fechas ingresadas por los usuarios finales estén en el AAAA-MM-DD. Regex nunca ha sido mi punto fuerte, sigo obteniendo un valor de retorno falso para el preg_match () que tengo configurado.

Entonces asumo que hice un lío de 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?


Esto debería indicar si el formato es válido y si la fecha de entrada es válida.

$datein = ''2012-11-0''; if(preg_match(''/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/'', $datein)){ echo ''good''; }else{ echo ''no good''; }


Para trabajar con fechas en php debe seguir el estándar de php para que la expresión regular proporcionada le garantice que tiene una fecha válida que puede operar con PHP.

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 :

$dt = DateTime::createFromFormat("Y-m-d", $date); return $dt !== false && !array_sum($dt->getLastErrors());

Esto también valida la entrada: $dt !== false asegura que la fecha se puede analizar con el formato especificado y el truco array_sum es una manera concisa de garantizar que PHP no haya realizado el "cambio de mes" (por ejemplo, considere que el 32 de enero es febrero) 1). Consulte DateTime::getLastErrors() para obtener más información.

Solución de la vieja escuela con explode y checkdate :

list($y, $m, $d) = array_pad(explode(''-'', $date, 3), 3, 0); return ctype_digit("$y$m$d") && checkdate($m, $d, $y);

Esto valida que la entrada sea una fecha válida también. Puedes hacerlo con una expresión regular, por supuesto, pero va a ser más complicado, y el 29 de febrero no se puede validar con una expresión regular.

El inconveniente de este enfoque es que debe tener mucho cuidado para rechazar todas las entradas "malas" posibles sin emitir un aviso bajo ninguna circunstancia. Así es cómo:

  • explode está limitado a devolver 3 tokens (por lo que si la entrada es "1-2-3-4", $d se convertirá en "3-4")
  • ctype_digit se usa para asegurarse de que la entrada no contenga caracteres no numéricos (aparte de los guiones)
  • array_pad se usa (con un valor predeterminado que hará que checkdate falle) para asegurarse de que se devuelven suficientes elementos de modo que si la entrada es "1-2", la list() no emitirá un aviso

Prueba esto.

$date="2012-09-12"; if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) { return true; } else { return false; }


Puede usar un preg_match con una función checkdate php

$date = "2012-10-05"; $split = array(); if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $split)) { return checkdate($split[2], $split[3], $split[1]); } return false;


Puedes hacerlo de esta manera:

if (preg_match("//d{4}/-/d{2}-/d{2}/", $date)) { echo ''true''; } else { echo ''false''; }

pero será mejor que uses este:

$date = DateTime::createFromFormat(''Y-m-d'', $date); if ($date) { echo $date -> format(''Y-m-d''); }

en este caso, obtendrá un objeto que es muck más fácil de usar que solo cadenas.


Sé que esta es una vieja pregunta. Pero creo que tengo una buena solución.

$date = "2016-02-21"; $format = "Y-m-d"; if(date($format, strtotime($date)) == date($date)) { echo "true"; } else { echo "false"; }

Puedes probarlo. Si cambia la fecha al 21.02.2016, el eco es falso. Y si cambia el formato después de dmY, el eco es verdadero.

Con este sencillo código, debería poder verificar qué formato de fecha se usa sin verificarlo con la expresión regular.

Tal vez haya una persona que lo probará en todos los casos. Pero creo que mi idea es generalmente válida. Para mí parece lógico.


Si desea unir ese tipo de fecha, use:

preg_match("~^/d{4}-/d{2}-/d{2}$~", $date)


También podrías hacerlo así:

if (DateTime::createFromFormat(''Y-m-d'', $date)->format(''Y-m-d'') === $date) { // date is correctly formatted and valid, execute some code }

Esto no solo verificará el formato, sino también la validez de la fecha, ya que DateTime solo creará fechas válidas y esto debe coincidir con la entrada.


Todo depende de qué tan estricto quieras que sea esta función. Por ejemplo, si no quiere permitir meses por encima de 12 y días por encima de 31 (no dependiendo del mes, eso requeriría escribir la lógica de fecha), podría ser bastante complicado:

function checkDate($date) { $regex = ''/^'' . ''('' . // Allows years 0000-9999 ''(?:[0-9]{4})'' . ''/-'' . // Allows 01-12 ''(?:'' . ''(?:01)|(?:02)|(?:03)|(?:04)|(?:05)|(?:06)|(?:07)|(?:08)|(?:09)|(?:10)|'' . ''(?:11)|(?:12)'' . '')'' . ''/-'' . // Allows 01-31 ''(?:'' . ''(?:01)|(?:02)|(?:03)|(?:04)|(?:05)|(?:06)|(?:07)|(?:08)|(?:09)|(?:10)|'' . ''(?:11)|(?:12)|(?:13)|(?:14)|(?:15)|(?:16)|(?:17)|(?:18)|(?:19)|(?:20)|'' . ''(?:21)|(?:22)|(?:23)|(?:24)|(?:25)|(?:26)|(?:27)|(?:28)|(?:29)|(?:30)|'' . ''(?:31)'' . '')'' . ''$/''; if ( preg_match($regex, $date) ) { return true; } return false; } $result = checkDate(''2012-09-12'');

Personalmente, simplemente iría por: /^([0-9]{4}/-([0-9]{2}/-[0-9]{2})$/


Verificar y validar la fecha YYYY-MM-DD en una declaración de línea

function isValidDate($date) { return preg_match("/^(/d{4})-(/d{1,2})-(/d{1,2})$/", $date, $m) ? checkdate(intval($m[2]), intval($m[3]), intval($m[1])) : false; }

El resultado será:

var_dump(isValidDate("2018-01-01")); // bool(true) var_dump(isValidDate("2018-1-1")); // bool(true) var_dump(isValidDate("2018-02-28")); // bool(true) var_dump(isValidDate("2018-02-30")); // bool(false)

Se permiten día y mes sin cero inicial. Si no quiere permitir esto, la expresión regular debería ser:

"/^(/d{4})-(/d{2})-(/d{2})$/"


preg_match necesita una u otra char como delimitador.

preg_match("/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$/",$date)

también debe verificar la validez de esa fecha para no terminar con algo como 9999-19-38

bool checkdate ( int $month , int $day , int $year )


puedes usar

function validateDate($date, $format = ''Y-m-d H:i:s'') { $d = DateTime::createFromFormat($format, $date); return $d && $d->format($format) == $date; } $date="2012-09-12"; echo validateDate($date, ''Y-m-d''); // true or false


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:

2004 - leap year - divisible by 4 1900 - not a leap year - divisible by 4, but also divisible by 100 2000 - leap year - divisible by 4, also divisible by 100, but divisible by 400

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:

1976-02-29 2000-02-29 2004-02-29 1999-01-31

Las siguientes fechas no deberían validar:

2015-02-29 2015-04-31 1900-02-29 1999-01-32 2015-02-00

Distancia:

Comprobaremos las fechas entre el 1 de enero de 1000 y el 31 de diciembre de 2999. Técnicamente, el calendario gregoriano utilizado actualmente solo entró en uso en 1753 para el Imperio británico y en varios años en el 1600 para los países de Europa, pero no voy a Preocúpate por eso.

Regex para probar un año bisiesto:

Los años divisibles por 400:

1200|1600|2000|2400|2800 can be shortened to: (1[26]|2[048])00 if you wanted all years from 1AD to 9999 then this would do it: (0[48]|[13579][26]|[2468][048])00 if you''re happy with accepting 0000 as a valid year then it can be shortened: ([13579][26]|[02468][048])00

Los años divisibles por 4:

[12]/d([02468][048]|[13579][26])

Los años divisibles por 100:

[12]/d00

No divisible por 100:

[12]/d([1-9]/d|/d[1-9])

Los años divisibles por 100 pero no por 400:

((1[1345789])|(2[1235679]))00

Divisible por 4 pero no por 100:

[12]/d([2468][048]|[13579][26]|0[48])

Los años bisiestos:

divisible by 400 or (divisible by 4 and not divisible by 100) ((1[26]|2[048])00)|[12]/d([2468][048]|[13579][26]|0[48])

No divisible por 4:

[12]/d([02468][1235679]|[13579][01345789])

No es un año bisiesto:

Not divisible by 4 OR is divisible by 100 but not by 400 ([12]/d([02468][1235679]|[13579][01345789]))|(((1[1345789])|(2[1235679]))00)

Válido Mes y día excluyendo febrero (MM-DD):

((01|03|05|07|08|10|12)-(0[1-9]|[12]/d|3[01]))|((04|06|09|11)-(0[1-9]|[12]/d|30)) shortened to: ((0[13578]|1[02])-(0[1-9]|[12]/d|3[01]))|((0[469]|11)-(0[1-9]|[12]/d|30))

Febrero con 28 días:

02-(0[1-9]|1/d|2[0-8])

Febrero con 29 días:

02-(0[1-9]|[12]/d)

Fecha válida:

(leap year followed by (valid month-day-excluding-february OR 29-day-february)) OR (non leap year followed by (valid month-day-excluding-february OR 28-day-february)) ((((1[26]|2[048])00)|[12]/d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]/d|3[01]))|((0[469]|11)-(0[1-9]|[12]/d|30)))|(02-(0[1-9]|[12]/d))))|((([12]/d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]/d|3[01]))|((0[469]|11)-(0[1-9]|[12]/d|30)))|(02-(0[1-9]|1/d|2[0-8]))))

De modo que hay una expresión regular para las fechas entre el 1 de enero de 1000 y el 31 de diciembre de 2999 en formato YYYY-MM-DD.

Sospecho que puede acortarse un poco, pero se lo dejo a alguien más.

Eso coincidirá con todas las fechas válidas. Si desea que solo sea válida cuando contiene solo una fecha y nada más, envuélvala en ^( )$ manera:

^(((((1[26]|2[048])00)|[12]/d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]/d|3[01]))|((0[469]|11)-(0[1-9]|[12]/d|30)))|(02-(0[1-9]|[12]/d))))|((([12]/d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]/d|3[01]))|((0[469]|11)-(0[1-9]|[12]/d|30)))|(02-(0[1-9]|1/d|2[0-8])))))$

Si lo desea para una entrada de fecha opcional (es decir, puede estar en blanco o una fecha válida), agregue ^$| al principio, así:

^$|^(((((1[26]|2[048])00)|[12]/d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]/d|3[01]))|((0[469]|11)-(0[1-9]|[12]/d|30)))|(02-(0[1-9]|[12]/d))))|((([12]/d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]/d|3[01]))|((0[469]|11)-(0[1-9]|[12]/d|30)))|(02-(0[1-9]|1/d|2[0-8])))))$


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-yyyy: /^(((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