我正在构建与Google Tasks同步的应用。作为同步的一部分,我想比较本地任务和API任务,看看最近哪一个已被更改。
Google API中的每项任务都包含updated
属性,如下所示:
2011-08-30T13:22:53.108Z
现在我想生成一个类似的时间戳,这样每次我在我的应用程序上更新任务时,它都会设置一个新的updated
值。要生成我使用的RFC 3339时间戳 - http://cbas.pandion.im/2009/10/generating-rfc-3339-timestamps-in.html生成如下内容:
2011-08-30T09:30:16.768-04:00
问题是,即使本地日期较新,API日期也总是比本地日期“更大”。我猜它与两者之间的不同格式有关。
以下是两个日期,顶部来自Google Tasks API(大约10分钟前),而最后一个是在一分钟前在本地生成的。当比较哪个更大时,它告诉我最重要的是。
2011-08-30T13:22:53.108Z
2011-08-30T09:41:00.735-04:00
我的格式错了吗?我在这做错了什么?对此的任何帮助都非常感谢。
答案 0 :(得分:40)
似乎已经给出了很多复杂的答案,但是这很好用,不是吗?
(new Date()).toISOString()
答案 1 :(得分:39)
格式是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 :(得分:10)
我发现moment.js库非常适合在javascript中使用时间。 moment().format()
生成一个时间戳,其格式为Google API预期的datetime
格式。或者,不依赖于您的应用程序的默认格式,
moment().format("YYYY-MM-DDTHH:mm:ssZ")
所有字符串选项(包括小数秒,如果这是你需要的):http://momentjs.com/docs/#/displaying/format/
答案 3 :(得分:4)
如果您使用的是Google Script,则另一种方法是使用以下的Utilities.formatDate网址:
以上网址的示例代码:
// 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'");
答案 4 :(得分: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/
答案 5 :(得分:1)
第一个日期后面的Z表示它是UTC(Zulu)时间,没有Z它将使用本地(计算机)时间,这可能是几个时区关闭。
答案 6 :(得分:1)
看起来更漂亮:
new Date().toISOString().split('.')[0] + 'Z'
答案 7 :(得分:0)
使用 date-fns
,这是非常优雅的:
import { formatRFC3339 } from 'date-fns'
const result = formatRFC3339(new Date(2019, 8, 18, 19, 0, 52))
//=> '2019-09-18T19:00:52Z'
来源: