【问题标题】:Generate an RFC 3339 timestamp similar to Google Tasks API?生成类似于 Google Tasks API 的 RFC 3339 时间戳?
【发布时间】:2011-11-06 20:07:42
【问题描述】:

我正在构建一个与 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

我的格式错了吗?我在这里做错了什么?非常感谢您对此的任何帮助。

【问题讨论】:

    标签: javascript timestamp google-tasks-api rfc3339 google-tasks


    【解决方案1】:

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

    【讨论】:

    • 哇,谢谢。我一定很困惑,因为谷歌说在拉取任务时希望“RFC 3339 时间戳”作为 updatedMin 参数传入。
    • RFC 3339 是 ISO 8601 的一个狭义子集。阅读 RFC 以获得很好的解释,为什么定义一个子集是有帮助的。几乎没有人使用或实现所有 ISO 8601 的选项,所以当人们说“ISO 格式”时,他们实际上通常是指一种特定格式,通常是 RFC 3339 关注的一种格式。
    【解决方案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/

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • Z char 表示时区,不能直接使用
        • moment().toISOString() // 2013-02-04T22:44:30.652Z
        • 如果语言本身有可用的东西,使用第三方库应该是最后的手段。
        【解决方案5】:

        如果您使用的是 Google Script,另一种选择是使用下面的 Utilities.formatDate URL:

        https://developers.google.com/apps-script/reference/utilities/utilities#formatDate(Date,String,String)

        来自上述网址的示例代码:

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

        【讨论】:

          【解决方案6】:

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

          new Date().toISOString()
          

          【讨论】:

          • toISOString() 给出了一种表示形式,它按照 RFC3339 标准将日期和月份数字反转。
          • 它包括几分之一秒: ​​2019-03-27T15:12:47.921Z 。你需要切断它们。
          • @LucaDiLiello RFC3339 说 YYYY-MM-DD,这就是 toISOString() 输出的内容。
          • @IvanYarych 几分之一秒是有效的 ISO8601/RFC3339 格式,只是很少使用。根据规范解析的任何东西都应该可以工作。
          【解决方案7】:

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

          【讨论】:

          • 他们要求的是 RFC 输出,而不是“漂亮”输出的一些模棱两可的定义;所以这不是主题。
          【解决方案8】:

          使用date-fns,这很优雅:

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

          来源:

          【讨论】:

          猜你喜欢
          • 2012-01-23
          • 2013-02-09
          • 1970-01-01
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-14
          相关资源
          最近更新 更多