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
}