Recibo una cadena de fecha de una API y está formateada como yyyy-mm-dd
.
Actualmente estoy usando una expresión regular para validar el formato de cadena, que funciona bien, pero puedo ver algunos casos en los que podría ser un formato correcto de acuerdo con la cadena pero en realidad una fecha no válida. es decir 2013-13-01
, por ejemplo.
¿Hay una mejor manera en PHP para tomar una cadena como 2013-13-01
y decir si es una fecha válida o no para el formato yyyy-mm-dd
?
Respuestas:
Puede usar la
DateTime
clase para este propósito:[ Función tomada de esta respuesta . También en php.net . Originalmente escrito por Glavić . ]
Casos de prueba:
¡Manifestación!
fuente
strtotime
para obtener la marca de tiempo de Unix y luegodate('Y-m-d', $t)
obtener la fecha de la cadena. Luego los comparas como esta respuesta.strtotime
, pero para formatos no estándar questrtotime
no reconoce, necesitará alguna otra solución. Y para el soporte de la versión 5.2 de php se detuvo en enero de 2011, para el soporte de 5.3 se detuvo en agosto de 2014.var_dump( validateDate('2012-2-9'));
'Y-n-j'
, @reignsly.$d
no será falso si le das la fecha, que ha desbordado partes, como el 13 ° mes (2013-13-01). Pero realmente depende de lo que quieras. Si necesita, por ejemplo,validateDate('2015-55-66')
ser válido, entonces sí, solo necesita verificar si$d
es objeto o no.Determinar si alguna cadena es una fecha
fuente
yyyy-mm-dd
.2015-02-30
como una fecha válida porque cuando el día dado es mayor que la cantidad de días en el mes dado (o negativo) php se transfiere al mes siguiente. Dado que se garantiza que la fecha tendrá el formato,yyyy-mm-dd
esto se puede corregir cambiando la devolución areturn (bool)strtotime($myDateString) && date("Y-m-d", strtotime($myDateString)) == $myDateString;
.(bool)strtotime('s')
sale como verdadero?$myDateString = str_replace("/", '-', $myDateString);
antes de regresar si la cadena de fecha contiene barras (/) como: - dd / mm / aaaaUsar de manera simple con la función prepilada de php:
Prueba
fuente
if
para regresar simplementetrue
ofalse
, regresar la prueba en sí.return sizeof($tmpDate) == 3 && checkdate($tmpDate[1]...
2
,20
,202
,2020
o incluso si el año es20201
- que devuelve verdadero cada vez.Determine si la cadena es una fecha, incluso si la cadena es un formato no estándar
(Strtotime no acepta ningún formato personalizado)
fuente
if
para regresar simplementetrue
ofalse
, devolver la prueba en sí.Esta opción no solo es simple sino que también acepta casi cualquier formato, aunque con formatos no estándar puede tener errores.
fuente
202
devuelve un número negativo, que aún pasa la prueba.También puede analizar la fecha del mes y año y luego puede usar la función PHP
checkdate()
que puede leer aquí: http://php.net/manual/en/function.checkdate.phpTambién puedes probar este:
fuente
La forma más fácil de verificar si la fecha dada es válida, probablemente convirtiéndola a unixtime usando
strtotime
, formateándola al formato de la fecha dada, y luego comparándola:function isValidDate($date) { return date('Y-m-d', strtotime($date)) === $date; }
Por supuesto, puede usar expresiones regulares para verificar la validez, pero se limitará al formato dado, cada vez que tenga que editarlo para satisfacer otros formatos, y también será más de lo requerido. Las funciones integradas son la mejor manera (en la mayoría de los casos) para lograr trabajos.
fuente
checkdate()
, pero encuentro que la fecha de verificación falla si el año es CUALQUIER valor:2, 20, 202, 2020, 20201
todos devuelven verdadero. Voy con tu solución!De acuerdo con la respuesta de cl-sah, pero esto suena mejor, más corto ...
Prueba
fuente
count($tempDate) === 3
embargoTengo esta cosa que, incluso con PHP, me gusta encontrar soluciones funcionales . Entonces, por ejemplo, la respuesta dada por @migli es realmente buena, altamente flexible y elegante.
Pero tiene un problema: ¿qué sucede si necesita validar muchas cadenas DateTime con el mismo formato? Tendría que repetir el formato en todo el lugar, lo que va en contra del principio DRY . Podríamos poner el formato en una constante, pero aún así, tendríamos que pasar la constante como argumento para cada llamada a la función.
¡Pero no temas más! ¡Podemos usar el curry para nuestro rescate! PHP no hace que esta tarea sea agradable, pero aún es posible implementar curry con PHP:
Entonces, ¿qué acabamos de hacer? Básicamente envolvimos el cuerpo de la función de forma anónima y devolvimos dicha función. Podemos llamar a la función de validación de esta manera:
Sí, no es una gran diferencia ... pero el poder real proviene de la función parcialmente aplicada , hecha posible al curry:
Programación funcional FTW!
fuente
Me temo que la solución más votada ( https://stackoverflow.com/a/19271434/3283279 ) no funciona correctamente. El cuarto caso de prueba (var_dump (validateDate ('2012-2-25')); // falso) está mal. La fecha es correcta, porque corresponde al formato: el m permite un mes con o sin cero a la izquierda (ver: http://php.net/manual/en/datetime.createfromformat.php ). Por lo tanto, una fecha 2012-2-25 está en formato Ymd y el caso de prueba debe ser verdadero, no falso.
Creo que la mejor solución es probar el posible error de la siguiente manera:
fuente
¿Que tal este?
Simplemente usamos un bloque try-catch.
Este enfoque no se limita a un solo formato de fecha / hora, y no necesita definir ninguna función.
fuente
'0000-00-00 00:00:00'
es un valor de fecha y hora válido. Es solo el primero el valor. Sin embargo, la propiedad de fecha del objeto datetime será'-0001-11-30 00:00:00'
.Solución probada de Regex:
Esto devolverá nulo si la fecha no es válida o no tiene el formato aaaa-mm-dd; de lo contrario, devolverá la fecha.
fuente
Validar con la función checkdate :
fuente
fuente
fuente
Prueba esto:
fuente