2011-08-30 47 views
18

我正在構建與Google任務同步的應用程序。作爲同步的一部分,我想比較本地任務和API任務,並查看哪一個最近發生了更改。生成類似於Google Tasks API的RFC 3339時間戳?

從谷歌的API每個任務都包含一個「更新」的屬性,它看起來像這樣:

2011-08-30T13:22:53.108Z 

現在我想產生類似的時間戳,所以,每次我上更新任務我應用程序會設置一個新的「更新」值。要生成我使用RFC 3339時間戳 - http://cbas.pandion.im/2009/10/generating-rfc-3339-timestamps-in.html產生這樣的:

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

的問題是,該API日期總是回來爲「大」比本地日期,即使在本地日期新。我猜測它與兩者之間的不同構成有關。

這裏有兩個日期,最上面的是谷歌API(從大約10分鐘前),最下面的一個是在一分鐘前在本地生成的。當比較更大時,它告訴我最重要的是。

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

我的格式是否錯誤?我在這裏做錯了什麼?任何對此的幫助真的很感激。

回答

36

格式是ISO,所以(new Date()).toISOString()會給你這種形式。這是我讀可能需要勻:

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

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

+2

哇謝謝。我一定很困惑,因爲谷歌說,當拉動任務時需要一個「RFC 3339時間戳」作爲updatedMin參數傳入。 – levi

2

試試這個:

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

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

9

我發現moment.js庫好的JavaScript中在時間上下功夫。 moment().format()會以Google API預期的格式產生datetime的時間戳。或者,不依賴於默認格式是爲您的應用正確,

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

所有字符串選項(包括零點幾秒,如果這就是你的需要):http://momentjs.com/docs/#/displaying/format/

+2

Z字符是時區的意思,你不能直接使用它 –

+17

moment()。toISOString()// 2013-02-04T22:44:30.652Z –

15

看起來好像有很多複雜的答案已經給出,但這工作得很好,不是嗎?

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