Сгенерировать временную метку RFC 3339, аналогичную API задач Google? - PullRequest
26 голосов
/ 30 августа 2011

Я нахожусь в процессе создания приложения, которое синхронизируется с Google Tasks. Как часть синхронизации, я хочу сравнить локальную задачу и задачу API и посмотреть, какая из них была изменена совсем недавно.

Каждая задача из API Google содержит свойство 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

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

Ответы [ 7 ]

42 голосов
/ 16 сентября 2016

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

(new Date()).toISOString()
40 голосов
/ 30 августа 2011

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

10 голосов
/ 25 сентября 2013

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

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

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

4 голосов
/ 18 октября 2013

Если вы используете 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'");
2 голосов
/ 30 августа 2011

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

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/

1 голос
/ 21 декабря 2018

выглядит более симпатично: new Date().toISOString().split('.')[0] + 'Z'

1 голос
/ 30 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...