javascript - vib - vmware host client ™ 1.8 0 ga
Javascript fecha de análisis en Iphone (4)
Estoy trabajando en un sitio de JavaScript con capacidad de conexión en línea que se dirige a dispositivos móviles. Uno de estos dispositivos móviles es el iPhone.
Estoy intentando analizar una fecha de nuestra API REST (un miembro del objeto JSON). Estoy usando
Date.parse("2010-03-15 10:30:00");
Esto funciona en dispositivos Android, sin embargo, en el iPhone solo da una fecha no válida.
¿Cómo debo formatear mi cadena de fecha para que pueda ser analizada por el iPhone?
No todos los navegadores admiten los mismos formatos de fecha. El mejor enfoque es dividir la cadena en los caracteres separadores ( -
, y
:
lugar, y pase cada uno de los elementos de matriz resultantes al constructor Date
:
var arr = "2010-03-15 10:30:00".split(/[- :]/),
date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
console.log(date);
//-> Mon Mar 15 2010 10:30:00 GMT+0000 (GMT Standard Time)
Esto funcionará igual en todos los navegadores.
Para el horario UTC / GMT, puedes probar:
var arr = "2014-10-27T16:05:44+0000".split(/[/-/+ :T]/);
var date = new Date();
date.setUTCFullYear(arr[0]);
date.setUTCMonth(arr[1] - 1);
date.setUTCDate(arr[2]);
date.setUTCHours(arr[3]);
date.setUTCMinutes(arr[4]);
date.setUTCSeconds(arr[5]);
El objeto de fecha se mostrará en la zona horaria local adecuada cuando se utilice.
Podría tener mejor suerte si se adhiere al formato ISO 8601 :
Date.parse("2010-03-15T10:30:00");
// e.g.
var d = new Date( Date.parse("2010-03-15T10:30:00") );
console.log( d.toString() ); //Mon Mar 15 2010 10:30:00 GMT+0000 (BST)
Si puede corregir su API REST para enviar las fechas correctas de ISO 8601, la forma correcta de manejar esto es usar un ajuste de expresión regular que permita a todos los navegadores procesar las fechas de ISO 8601. Claro que podría ser más lento, pero manejar las fechas con Javascript es como tratar de meter a un gato en una tina de agua.
Tenga en cuenta que el siguiente método reemplaza el método Date.parse original. Esto podría ser problemático en proyectos más grandes o con muchos desarrolladores con diferentes expectativas. Úsalo solo si eres consciente de lo que estás haciendo.
/**
* Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
* © 2011 Colin Snover <http://zetafleet.com>
* Released under MIT license.
*/
(function (Date, undefined) {
var origParse = Date.parse, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ];
Date.parse = function (date) {
var timestamp, struct, minutesOffset = 0;
// ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
// before falling back to any implementation-specific date parsing, so that’s what we do, even if native
// implementations could be faster
// 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
if ((struct = /^(/d{4}|[+/-]/d{6})(?:-(/d{2})(?:-(/d{2}))?)?(?:T(/d{2}):(/d{2})(?::(/d{2})(?:/.(/d{3}))?)?(?:(Z)|([+/-])(/d{2})(?::(/d{2}))?)?)?$/.exec(date))) {
// avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
for (var i = 0, k; (k = numericKeys[i]); ++i) {
struct[k] = +struct[k] || 0;
}
// allow undefined days and months
struct[2] = (+struct[2] || 1) - 1;
struct[3] = +struct[3] || 1;
if (struct[8] !== ''Z'' && struct[9] !== undefined) {
minutesOffset = struct[10] * 60 + struct[11];
if (struct[9] === ''+'') {
minutesOffset = 0 - minutesOffset;
}
}
timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
}
else {
timestamp = origParse ? origParse(date) : NaN;
}
return timestamp;
};
}(Date));