javascript - ¿Generar una marca de tiempo RFC 3339 similar a la API de tareas de Google?
timestamp google-tasks-api (6)
El formato es ISO, por lo que (new Date()).toISOString()
le dará ese formulario. Que mientras estoy leyendo podría necesitar ser shimmed:
/* use a function for the exact format desired... */
function ISODateString(d){
function pad(n){return n<10 ? ''0''+n : n}
return d.getUTCFullYear()+''-''
+ pad(d.getUTCMonth()+1)+''-''
+ pad(d.getUTCDate())+''T''
+ pad(d.getUTCHours())+'':''
+ pad(d.getUTCMinutes())+'':''
+ pad(d.getUTCSeconds())+''Z''}
var d = new Date();
print(ISODateString(d)); // prints something like 2009-09-28T19:03:12Z
Fuente: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date
Estoy en el proceso de crear una aplicación que se sincronice con Google Tasks. Como parte de la sincronización, quiero comparar la tarea local y la tarea de la API, y ver cuál se ha cambiado más recientemente.
Cada tarea de la API de Google contiene una propiedad updated
, que se parece a esto:
2011-08-30T13:22:53.108Z
Ahora me gustaría generar una marca de tiempo similar a esa, para que cada vez que actualice una tarea en mi aplicación, establezca un nuevo valor updated
. Para generar la marca de tiempo RFC 3339 que estoy usando - http://cbas.pandion.im/2009/10/generating-rfc-3339-timestamps-in.html que genera algo como esto:
2011-08-30T09:30:16.768-04:00
El problema es que la fecha de la API siempre vuelve como "mayor" que la fecha local, incluso cuando la fecha local es más reciente. Supongo que tiene algo que ver con el formato diferente entre los dos.
Aquí hay dos fechas, la superior es de la API de tareas de Google (desde hace unos 10 minutos), y la inferior se generó localmente hace un minuto. Cuando se compara lo que es mayor, me dice que el de arriba es.
2011-08-30T13:22:53.108Z
2011-08-30T09:41:00.735-04:00
¿Mi formato es incorrecto? ¿Qué estoy haciendo mal aquí? Cualquier ayuda en esto es realmente apreciada.
He encontrado la biblioteca moment.js agradable para trabajar con tiempo en javascript. moment().format()
produce una marca de tiempo en el formato esperado por la API de Google por datetime
y datetime
. O, para no depender de que el formato predeterminado sea correcto para su aplicación,
moment().format("YYYY-MM-DDTHH:mm:ssZ")
Todas las opciones de cadena (incluidos los segundos fraccionarios si eso es lo que necesita): http://momentjs.com/docs/#/displaying/format/
La Z detrás de la primera fecha indica que es la hora UTC (Zulu), sin la Z usará la hora local (computadora), que podría estar desactivada en varias zonas horarias.
Parece que se han dado muchas respuestas complicadas, pero esto funciona bien, ¿no es así?
(new Date()).toISOString()
Si está utilizando Google Script, otra opción es usar la URL de Utilities.formatDate a continuación:
Código de muestra de la URL anterior:
// This formats the date as Greenwich Mean Time in the format
// year-month-dateThour-minute-second.
var formattedDate = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd''T''HH:mm:ss''Z''");
prueba esto:
Date.prototype.setRFC3339 = function(dString) {
var utcOffset, offsetSplitChar;
var offsetMultiplier = 1;
var dateTime = dString.split("T");
var date = dateTime[0].split("-");
var time = dateTime[1].split(":");
var offsetField = time[time.length - 1];
var offsetString;
offsetFieldIdentifier = offsetField.charAt(offsetField.length - 1);
if (offsetFieldIdentifier == "Z") {
utcOffset = 0;
time[time.length - 1] = offsetField.substr(0, offsetField.length - 2);
} else {
if (offsetField[offsetField.length - 1].indexOf("+") != -1) {
offsetSplitChar = "+";
offsetMultiplier = 1;
} else {
offsetSplitChar = "-";
offsetMultiplier = -1;
}
offsetString = offsetField.split(offsetSplitChar);
time[time.length - 1] == offsetString[0];
offsetString = offsetString[1].split(":");
utcOffset = (offsetString[0] * 60) + offsetString[1];
utcOffset = utcOffset * 60 * 1000;
}
this.setTime(Date.UTC(date[0], date[1] - 1, date[2], time[0], time[1], time[2]) + (utcOffset * offsetMultiplier));
return this;
};
fuente: http://blog.toppingdesign.com/2009/08/13/fast-rfc-3339-date-processing-in-javascript/