javascript - Regex e ISO8601 formateados DateTime
(5)
JavaScript date.toISOString () regex
Esto solo intenta resolver el patrón básico de 2017-06-17T00:00:00.000Z
que espera de Javascript al hacerlo.
const isoPattern = /^/d{4}-/d{2}-/d{2}T/d{2}:/d{2}:/d{2}/./d{3}Z$/;
Una de las cosas más molestas de JSON es que no se puede simplemente pasar una fecha y esperar que se convierta correctamente. Como la mayoría de las personas usa JavaScript, esto es probablemente práctico.
Aquí hay un fragmento de demostración si tiene que pasar a mongo y necesita convertir.
if (isoPattern.test(json.startDate))
json.startDate = new Date(json.startDate);
Considero que este es un mejor enfoque, ya que puede estar seguro de que la fecha analizará, luego puede verificar el rango deseado, todo siendo bastante directo y fácil de mantener ya que la expresión regular es excelente, pero hasta cierto punto.
Tengo una cadena DateTime ISO8601 formateada
2012-10-06T04:13:00+00:00
y el siguiente Regex que no coincide con esta cadena
#(/d{4})-(/d{2})-(/d{2})T(/d{2})/:(/d{2})/:(/d{2})/+(/d{2})/:(/d{2})#
No puedo entender por qué no coincide.
Escapé de metacaracteres, para mí parece estar bien.
EDITAR:
El camino correcto: http://jsfiddle.net/5n5vk/3/
Incompleto Regex
Está incompleto ya que coincide con una fecha no válida 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 ( consulte la Validación de la fecha ISO 8601 que no apesta ). Puedes probar con el siguiente código:
re = /^([/+-]?/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)?)?)?)?$/
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 quería saber si una cadena contiene una cadena de fecha ISO 8601. Comprobaré si la fecha es realmente válida después de convertirla en un objeto Date .
Aquí hay 2 versiones de RegExp. Esto primero comprueba si la cadena es una cadena de fecha ISO 8601 válida. La otra prueba para una cadena de fecha completa que incluye las horas / minutos / segundos (se usa comúnmente en las 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 = /^/d{4}(-/d/d(-/d/d(T/d/d:/d/d(:/d/d)?(/./d+)?(([+-]/d/d:/d/d)|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 = /^/d{4}-/d/d-/d/dT/d/d:/d/d:/d/d(/./d+)?(([+-]/d/d:/d/d)|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 cites la expresión regular al especificar una expresión regular en js. Barra diagonal es suficiente.
alert($(''#datepicker'').val());
if($(''#datepicker'').val().match(
/(/d{4})-(/d{2})-(/d{2})T(/d{2})/:(/d{2})/:(/d{2})[+-](/d{2})/:(/d{2})/
)) {
alert(''ok'');
} else {
alert(''not ok'');
}
Para agregar a todas estas buenas respuestas, encontré que esta funciona bastante bien solo para fechas ISO (sin tiempo)
(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))
(v = pase x = does-not-pass)
2016-12-30 v
2016-13-31 x
2016-01-32 x
2016-02-29 v
2016-02-30 x
2017-02-29 v -> that''s a false positive
1889-01-01 x -> you can add accepted centuries in the list: (?:18|19|20)
2099-01-01 v