2011-08-30 117 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();