2011-08-30 16 views
18

Estoy en proceso de crear una aplicación que se sincronice con las tareas de google. Como parte de la sincronización, quiero comparar la tarea local y la tarea API, y ver cuál se ha cambiado más recientemente.¿Genera una marca de tiempo RFC 3339 similar a la API de tareas de Google?

Cada tarea de la API de Google contiene una propiedad de "actualización", que se ve así:

2011-08-30T13:22:53.108Z 

Ahora me gustaría para generar una marca de tiempo similar a la que, por lo que cada vez que actualice una tarea en mi aplicación establece un nuevo valor "actualizado". Para generar la marca de tiempo RFC 3339 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 

La cuestión es, la fecha API es siempre presentes como "mayor" que la fecha local, incluso cuando la fecha local es más nuevo. Supongo que tiene algo que ver con el formmating diferente entre los dos.

Aquí hay dos fechas, la parte superior es de la API de Google (desde hace unos 10 minutos), y la de abajo se generó localmente hace un minuto. Cuando se compara, que es mayor, me dice que el superior es.

2011-08-30T13:22:53.108Z 
2011-08-30T09:41:00.735-04:00 

¿Es mi formato incorrecto? ¿Qué estoy haciendo mal aquí? Cualquier ayuda sobre esto es realmente apreciada.

Respuesta

36

El formato es ISO por lo que (new Date()).toISOString() le dará ese formulario. Que, como estoy leyendo podría ser necesario calzar:

/* 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

+2

Wow gracias. Debo haberme confundido, porque Google dice que quiere una "marca de tiempo RFC 3339" para pasar como un argumento de Minin actualizado al tirar de tareas. – levi

2

probar 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/

2

El Z detrás de la primera fecha indica es hora UTC (Zulu), sin la Z utilizará la hora local (computadora), que podría estar fuera de varias zonas horarias.

Ver: http://en.wikipedia.org/wiki/UTC

9

he encontrado los moment.js buena biblioteca para trabajar con el tiempo en javascript. moment().format() produce una marca de tiempo en el formato esperado por la API de Google para un datetime. O, para no depender del formato por defecto de ser correcto para su aplicación,

moment().format("YYYY-MM-DDTHH:mm:ssZ") 

Todas las opciones de cadena (incluyendo fracciones de segundo, si eso es lo que necesita): http://momentjs.com/docs/#/displaying/format/

+2

Z char es la zona horaria, no se puede usar directamente –

+17

momento(). ToISOString() // 2013-02-04T22: 44: 30.652Z –

15

Parece que se han dado muchas respuestas complicadas, pero esto funciona bien, ¿no es así?

new Date(Date.now()).toISOString(); 
Cuestiones relacionadas