Создать метку времени RFC 3339, похожую на Google Tasks API?

Я нахожусь в процессе создания приложения, которое синхронизируется с 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 всегда возвращается как «больше», чем местная дата, даже если местная дата новее. Я предполагаю, что это как-то связано с разным форматированием между ними.

Вот две даты, верхняя - из API задач Google (примерно 10 минут назад), а нижняя была сгенерирована локально минуту назад. Если сравнивать, что больше, он говорит мне, что лучший.

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

У меня неправильное форматирование? Что я здесь делаю не так? Любая помощь в этом действительно приветствуется.


person levi    schedule 30.08.2011    source источник


Ответы (8)


Форматирование соответствует 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

person Joe    schedule 30.08.2011
comment
Вау, спасибо. Я, должно быть, запутался, потому что Google говорит, что хочет, чтобы временная метка RFC 3339 передавалась в качестве аргумента updatedMin при извлечении задач. - person levi; 30.08.2011
comment
RFC 3339 - это узкое подмножество ISO 8601. Прочтите RFC, чтобы получить отличные объяснения, почему определение подмножества было полезным. Почти никто не использует или не реализует все параметры ISO 8601, поэтому, когда люди говорят о формате ISO, они де-факто обычно имеют в виду один конкретный формат, часто тот, на котором фокусируется RFC 3339. - person Beni Cherniavsky-Paskin; 04.08.2020

Кажется, что было дано много сложных ответов, но это прекрасно работает, не так ли?

new Date().toISOString()
person Trenton D. Adams    schedule 16.09.2016
comment
toISOString() дает представление, в котором цифры дня и месяца инвертированы в соответствии со стандартом RFC3339. - person Luca Di Liello; 05.03.2019
comment
Включает доли секунды: 2019-03-27T15: 12: 47.921Z. Вам нужно будет их отрезать. - person Ivan Yarych; 27.03.2019
comment
@LucaDiLiello RFC3339 говорит YYYY-MM-DD, это то, что выводит toISOString (). - person Trenton D. Adams; 01.05.2019
comment
@IvanYarych Доли секунды являются допустимым форматом ISO8601 / RFC3339, просто он используется редко. Все, что выполняет синтаксический анализ в соответствии со спецификацией, должно просто работать. - person Trenton D. Adams; 01.05.2019

Я нашел библиотеку moment.js удобной для работы со временем в javascript. moment().format() выдает отметку времени в формате, ожидаемом Google API для datetime. Или, чтобы не зависеть от формата по умолчанию, правильного для вашего приложения,

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

Все параметры строки (включая дробные секунды, если это то, что вам нужно): http://momentjs.com/docs/#/displaying/format/

person Donny Winston    schedule 25.09.2013
comment
Z char означает часовой пояс, вы не можете использовать его напрямую - person Baryon Lee; 01.05.2014
comment
момент (). toISOString () // 2013-02-04T22: 44: 30.652Z - person Baryon Lee; 01.05.2014

Если вы используете Google Script, другой вариант - использовать приведенный ниже URL-адрес Utilities.formatDate:

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

Пример кода из приведенного выше 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'");
person Kilimanjaro T Robbs    schedule 18.10.2013

попробуй это:

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/

person Marek Sebera    schedule 30.08.2011

Z за первой датой означает, что это время UTC (зулусское время), без Z будет использоваться местное (компьютерное) время, которое может отличаться от нескольких часовых поясов.

См .: http://en.wikipedia.org/wiki/UTC

person Aidamina    schedule 30.08.2011

Используя date-fns, это очень элегантно:

import { formatRFC3339 } from 'date-fns'

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

Источник:

person Bob    schedule 21.06.2021

Смотрится красивее: new Date().toISOString().split('.')[0] + 'Z'

person Morbo    schedule 20.12.2018
comment
Они просили вывод RFC, а не какое-то двусмысленное определение красивого вывода; так что это не по теме. - person Trenton D. Adams; 04.06.2020