obtener now new fecha espaƱol actual php validation iso8601

now - string to date php



PHP validar la cadena de fecha ISO 8601 (5)

¿Cómo validar la cadena de fecha ISO 8601 (por ejemplo: 2011-10-02T23: 25: 42Z)?

Sé que hay varias representaciones posibles de las fechas ISO 8601, pero solo me interesa validar el formato que di como ejemplo anterior.

¡Gracias!


Consulte http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ . Le da a este regex utilizar:

^([/+-]?/d{4}(?!/d{2}/b))((-?)((0[1-9]|1[0-2])(/3([12]/d|0[1-9]|3[01]))?|W([0-4]/d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]/d|[12]/d{2}|3([0-5]/d|6[1-6])))([T/s]((([01]/d|2[0-3])((:?)[0-5]/d)?|24/:?00)([/.,]/d+(?!:))?)?(/17[0-5]/d([/.,]/d+)?)?([zZ]|([/+-])([01]/d|2[0-3]):?([0-5]/d)?)?)?)?$

Supongo que esto no responde exactamente a su pregunta, ya que coincidirá con cualquier fecha ISO 8601 válida, pero si está bien, entonces esto funciona perfectamente.


Esta es la función que uso. Es similar a la respuesta de drew010 pero funciona también para las marcas de tiempo que terminan con "+01: 00" o "-01: 00".

function isTimestampIsoValid($timestamp) { if (preg_match(''/^''. ''(/d{4})-(/d{2})-(/d{2})T''. // YYYY-MM-DDT ex: 2014-01-01T ''(/d{2}):(/d{2}):(/d{2})''. // HH-MM-SS ex: 17:00:00 ''(Z|((-|/+)/d{2}:/d{2}))''. // Z or +01:00 or -01:00 ''$/'', $timestamp, $parts) == true) { try { new /DateTime($timestamp); return true; } catch ( /Exception $e) { return false; } } else { return false; } }


Esto me funcionó, usa una expresión regular para asegurarse de que la fecha esté en el formato que desea, y luego intenta analizar la fecha y volver a crearla para asegurarse de que la salida coincida con la entrada:

<?php $date = ''2011-10-02T23:25:42Z''; var_dump(validateDate($date)); $date = ''2011-17-17T23:25:42Z''; var_dump(validateDate($date)); function validateDate($date) { if (preg_match(''/^(/d{4})-(/d{2})-(/d{2})T(/d{2}):(/d{2}):(/d{2})Z$/'', $date, $parts) == true) { $time = gmmktime($parts[4], $parts[5], $parts[6], $parts[2], $parts[3], $parts[1]); $input_time = strtotime($date); if ($input_time === false) return false; return $input_time == $time; } else { return false; } }

Puede expandirse aún más para usar checkdate para asegurarse de que el día y el año del mes también sean válidos.


Quiero compartir mi solución ligera. No es ideal, pero podría ser útil para alguien.

function validISO8601Date($value) { if (!is_string($value)) { return false; } $dateTime = /DateTime::createFromFormat(/DateTime::ISO8601, $value); if ($dateTime) { return $dateTime->format(/DateTime::ISO8601) === $value; } return false; }

Atencion

Algunas fechas válidas de ISO8601 fallarán Mire la lista a continuación

NOT VALID --> '''' // Correct NOT VALID --> ''string'' // Correct VALID --> ''2000-01-01T01:00:00+1200'' // This is the only format function returns as valid NOT VALID --> ''2015-01 first'' // Correct NOT VALID --> ''2000-01-01T01:00:00Z'' // Must be valid! NOT VALID --> ''2000-01-01T01:00:00+01'' // Must be valid!


Edición: por mucho, el método más sencillo es simplemente intentar crear un objeto DateTime usando la cadena, por ejemplo

$dt = new DateTime($dateTimeString);

Si el constructor DateTime no puede analizar la cadena, lanzará una excepción, por ejemplo

DateTime :: __ construct (): no se pudo analizar la cadena de tiempo (2011-10-02T23: 25: 72Z) en la posición 18 (2): carácter inesperado

Tenga en cuenta que si omite el designador de zona horaria, utilizará la zona horaria predeterminada configurada.

El segundo método más fácil es usar una expresión regular. Algo como esto debe cubrirlo

if (preg_match(''/^(/d{4})-(/d{2})-(/d{2})T(/d{2}):(/d{2}):(/d{2})(Z|(/+|-)/d{2}(:?/d{2})?)$/'', $dateString, $parts)) { // valid string format, can now check parts $year = $parts[1]; $month = $parts[2]; $day = $parts[3]; // etc }