Nuestros investigadores estrellas han agotado sus provisiones de café, en su búsqueda día y noche por la solución, hasta que Maya halló el resultado en Beanstalk y hoy la compartimos contigo.
Solución:
expresión regular incompleta
esta incompleto como coincide con fecha inválida tal como 2013-99-99T04:13:00+00:00
.
Mejor solución
La expresión regular a continuación no coincidirá con este tipo de fecha no válida (cf. Validación de fecha ISO 8601 que no apesta). Puedes probar con el siguiente código:
re = /^([+-]?d4(?!d2b))((-?)((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]d2|3([0-5]d|6[1-6])))([Ts]((([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)?)?)?)?$/
var testDates =
'date' : "2012-10-06T04:13:00+00:00",
'validDate' : "0785-10-10T04:13:00+00:00",
'invalidDate' : "2013-99-99T04:13:00+00:00",
'1234Date': '1234'
for (var d in testDates)
if (re.test(testDates[d])) console.info('[valid]: '+testDates[d]);
else console.error('[invalid]: '+testDates[d]);
Encontré el RegExp que también intenta validar la fecha un poco exagerado para mí. solo queria saber si un string contiene una fecha ISO 8601 string. Verificaré si la fecha es realmente válida después de convertirla en un objeto Fecha.
Aquí hay 2 versiones de RegExp. Esto primero verifica si el string es una fecha ISO 8601 válida string. Las otras pruebas para una fecha completa string incluyendo las horas/minutos/segundos (Usado comúnmente en API)
/**
* RegExp to test a string for a ISO 8601 Date spec
* YYYY
* YYYY-MM
* YYYY-MM-DD
* YYYY-MM-DDThh:mmTZD
* YYYY-MM-DDThh:mm:ssTZD
* YYYY-MM-DDThh:mm:ss.sTZD
* @see: https://www.w3.org/TR/NOTE-datetime
* @type RegExp
*/
var ISO_8601 = /^d4(-dd(-dd(Tdd:dd(:dd)?(.d+)?(([+-]dd:dd)|Z)?)?)?)?$/i
/**
* RegExp to test a string for a full ISO 8601 Date
* Does not do any sort of date validation, only checks if the string is according to the ISO 8601 spec.
* YYYY-MM-DDThh:mm:ss
* YYYY-MM-DDThh:mm:ssTZD
* YYYY-MM-DDThh:mm:ss.sTZD
* @see: https://www.w3.org/TR/NOTE-datetime
* @type RegExp
*/
var ISO_8601_FULL = /^d4-dd-ddTdd:dd:dd(.d+)?(([+-]dd:dd)|Z)?$/i
// Usage:
ISO_8601_FULL.test( "2016-05-24T15:54:14.876Z" ) // true
ISO_8601_FULL.test( "2002-12-31T23:00:00+01:00" ) // true
ISO_8601_FULL.test( "2016-02-01" ) // false
ISO_8601_FULL.test( "2016" ) // false
ISO_8601.test( "2016-02-01" ) // true
ISO_8601.test( "2016" ) // true
ISO_8601.test( "2002-12-31T23:00:00+01:00" ) // true
No cite la expresión regular al especificar una expresión regular en js. La barra diagonal es suficiente.
alert($('#datepicker').val());
if($('#datepicker').val().match(
/(d4)-(d2)-(d2)T(d2):(d2):(d2)[+-](d2):(d2)/
))
alert('ok');
else
alert('not ok');
Recuerda algo, que tienes permiso de añadir una estimación verdadera si atinaste tu rompecabezas justo a tiempo.