javascript - para - datepicker html
¿Cómo se analizan las fechas de los archivos del calendario con JavaScript? (3)
Necesitamos usar JavaScript en el navegador para leer y analizar los archivos de calendario (.ics) (también llamados formatos iCal). Escribí una función personalizada para leer estos valores y luego uso la función JavaScript Date () para hacer un objeto de datos.
¿Hay alguna manera más fácil y mejor de hacer esto? Por favor mira mi función (abajo), tus comentarios serán bienvenidos.
Un valor de fecha típico de un archivo .ics se ve así:
DTSTART: 20110914T184000Z
Necesidad de separarlo en el colon, entonces:
var strData = ''DTSTART:20110914T184000Z''
var x = strData.indexOf(":");
var strVal = strData.slice(x + 1 );
luego, llame a una función que devuelve un objeto de fecha:
var dateObj = calenDate(strVal);
// valor de dateObj resultante: viernes 14 de octubre de 2011 18:40:00 GMT-0400 (hora diurna del este)
Aquí está la función que analiza la fecha.
function calenDate(icalStr) {
// icalStr = ''20110914T184000Z''
var strYear = icalStr.substr(0,4);
var strMonth = icalStr.substr(4,2);
var strDay = icalStr.substr(6,2);
var strHour = icalStr.substr(9,2);
var strMin = icalStr.substr(11,2);
var strSec = icalStr.substr(13,2);
var oDate = new Date(strYear,strMonth, strDay, strHour, strMin, strSec)
return oDate;
}
Creo que algo está mal ya que el mes se está equivocando.
Este es un paquete nuevo (con pruebas) que parece funcionar bien: ical-date-parser
Uso
import iCalDateParser from ''ical-date-parser'';
iCalDateParser(''20140422T233000Z'');
Por alguna extraña razón, el parámetro del mes está basado en cero ( referencia ).
Cambia esta línea en tu función.
var strMonth = icalStr.substr(4,2);
a esto:
var strMonth = parseInt(icalStr.substr(4,2),10)-1;
Ver demostración de trabajo en jsFiddle: http://jsfiddle.net/cTkTQ/
Una forma algo más robusta de analizar las fechas sería:
var parser = XRegExp("^ (?<prefix> [^:;]+ ) # DTSTART/DTEND/DTSTAMP /n/
((:|;TZID=(?<tz>[^:]+):)) # timezone /n/
(?<year> [0-9]{4} ) # year /n/
(?<month> [0-9]{2} ) # month /n/
(?<day> [0-9]{2} ) T # day /n/
(?<hour> [0-9]{2} ) # hour /n/
(?<minute> [0-9]{2} ) # minute /n/
(?<second> [0-9]{2} ) # second /n/
(?<utc> Z? ) # utc", "x");
parts = parser.exec (d);
var od = new Date (parseInt (parts.year, 10),
parseInt (parts.month, 10) - 1,
parseInt (parts.day, 10),
parseInt (parts.hour, 10),
parseInt (parts.minute, 10),
parseInt (parts.second, 10));
Esto requiere que agregue una dependencia adicional (pequeña), XRegExp , que puede ser un poco exagerada, dependiendo de sus necesidades adicionales, pero permite un análisis de expresiones regulares limpio y fácil de leer del formato de fecha en archivos .ics. Esto también tiene en cuenta el identificador de zona horaria, si la fecha no es UTC. Dejo que usted agregue el manejo adecuado de las zonas horarias, así como el uso de la parte de prefix
.
La respuesta corta (según lo notado por jessegavin), sin embargo, es que el parámetro de month
del constructor espera un número entre 0-11 (consulte la Red de desarrolladores de Mozilla para obtener más información). Sin embargo, parseInt()
intenta analizar los ceros a la izquierda como radix 8
(octal), por lo que debe asegurarse de agregar también radix 10
, ese sería el segundo parámetro para parseInt(string [, radix])
.