生成一个类似于Google Tasks API的RFC 3339时间戳

Generate an RFC 3339 timestamp similar to Google Tasks API?

本文关键字:API Tasks RFC 时间戳 3339 Google 类似于 一个      更新时间:2023-09-26

我正在构建一个与谷歌任务同步的应用程序。作为同步的一部分,我想比较本地任务和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

我的格式有问题吗?我哪里做错了?

似乎已经给出了很多复杂的答案,但这工作得很好,不是吗?

new Date().toISOString()

格式是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

我发现moment.js库非常适合在javascript中处理时间。moment().format()以Google API对datetime期望的格式产生时间戳。或者,为了不依赖于您的应用程序的默认格式是否正确,

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

所有字符串选项(包括小数秒,如果你需要的话):http://momentjs.com/docs/#/displaying/format/

如果你使用的是Google Script,另一个选择是使用Utilities。formatDate URL如下:

https://developers.google.com/apps-script/reference/utilities/utilities formatDate(日期字符串,字符串)

上面URL的示例代码:

// 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'");

使用date-fns,这是非常优雅的:

import { formatRFC3339 } from 'date-fns'
const result = formatRFC3339(new Date(2019, 8, 18, 19, 0, 52))
//=> '2019-09-18T19:00:52Z'
源:

try this:

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 -日期-处理- javascript/

第一个日期后面的Z表示它是UTC(祖鲁)时间,没有Z将使用本地(计算机)时间,这可能是几个时区。

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

看起来更漂亮了:new Date().toISOString().split('.')[0] + 'Z'