Создайте временную метку RFC 3339, подобную API Google Tasks?
Я нахожусь в процессе создания приложения, которое синхронизируется с 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 Tasks (около 10 минут назад), а нижняя была сгенерирована локально минуту назад. Если сравнивать, что больше, это говорит мне, что самый лучший.
2011-08-30T13:22:53.108Z
2011-08-30T09:41:00.735-04:00
Мое форматирование неправильно? Что я здесь не так делаю? Любая помощь в этом действительно приветствуется.
Ответы
Ответ 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
Ответ 2
Кажется, что было дано много сложных ответов, но это прекрасно работает, не так ли?
(new Date()).toISOString()
Ответ 3
Я нашел библиотеку moment.js, которая отлично подходит для работы со временем в javascript. moment().format()
дает отметку времени в формате, ожидаемом API Google для datetime
. Или, чтобы не зависел от формата по умолчанию, подходящего для вашего приложения,
moment().format("YYYY-MM-DDTHH:mm:ssZ")
Все параметры строки (включая дробные секунды, если это необходимо): http://momentjs.com/docs/#/displaying/format/
Ответ 4
Если вы используете 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'");
Ответ 5
попробуйте следующее:
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/
Ответ 6
Z за первой датой указывает время UTC (Zulu), без Z оно будет использовать локальное (компьютерное) время, которое может выходить из нескольких часовых поясов.
Смотрите: http://en.wikipedia.org/wiki/UTC
Ответ 7
Это выглядит более красиво: (new Date()).toISOString().split('.')[0] + 'Z'