2011-08-30 17 views
18

Sono in procinto di creare un'app che si sincronizza con le attività di google. Come parte della sincronizzazione, voglio confrontare l'attività locale e l'attività API e vedere quale è stata modificata più di recente.Generare un timestamp RFC 3339 simile all'API di Google Task?

Ogni attività da API di Google contiene una proprietà "aggiornato", che assomiglia a questo:

2011-08-30T13:22:53.108Z 

Ora vorrei generare un timestamp simile a quello, in modo che ogni volta che aggiorna un compito sul mio app imposta un nuovo valore "aggiornato". Per generare il timestamp RFC 3339 Sto usando - http://cbas.pandion.im/2009/10/generating-rfc-3339-timestamps-in.html che genera qualcosa di simile:

2011-08-30T09:30:16.768-04:00 

Il problema è, la data di API è sempre tornando come "superiori" rispetto alla data locale, anche se la data locale è più nuovo. Immagino che abbia qualcosa a che fare con la diversa forma di accoppiamento tra i due.

Qui ci sono due date, la parte superiore proviene da Google API (da circa 10 minuti fa), e quella in basso è stata generata localmente un minuto fa. Quando confrontato quale è maggiore, è il suo dirmi che il primo è.

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

La mia formattazione è errata? Cosa sto facendo di sbagliato qui? Qualsiasi aiuto su questo è molto apprezzato.

risposta

36

La formattazione è ISO, quindi (new Date()).toISOString() fornirà tale modulo. Che, come sto leggendo potrebbe aver bisogno di essere spessorato:

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

Fonte: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

+2

Wow, grazie. Devo essermi confuso perché google dice che vuole un "timestamp RFC 3339" da passare come argomento updateMin durante il pull delle attività. – levi

2

provare questo:

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; 
}; 

fonte: http://blog.toppingdesign.com/2009/08/13/fast-rfc-3339-date-processing-in-javascript/

2

La Z dietro la prima data indica è ora UTC (Zulu), senza Z utilizzerà l'ora locale (computer), che potrebbe essere disattivata in diversi fusi orari.

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

9

ho trovato le moment.js bella libreria per lavorare con il tempo in javascript. moment().format() restituisce un timestamp nel formato previsto dall'API di Google per un datetime. O, per non dipendere dal formato di default di essere corretto per la vostra applicazione,

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

Tutte le opzioni di stringa (compresi i secondi frazionari, se questo è quello che vi serve): http://momentjs.com/docs/#/displaying/format/

+2

il carattere Z è nel fuso orario, non è possibile utilizzarlo direttamente –

+17

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

15

Sembra che siano state fornite molte risposte complicate, ma funziona bene, no?

new Date(Date.now()).toISOString(); 
Problemi correlati