Как ISO 8601 форматировать дату со смещением часового пояса в JavaScript?
цель: найти local time и UTC time offset затем построить URL-адрес в следующем формате.
пример URL: / действия / сон?продолжительность=2002-10-10T12:00:00-05:00
формат основан на рекомендации W3C:
http://www.w3.org/TR/xmlschema11-2/#dateTime
в документации сказано, что:
For example, 2002-10-10T12:00:00−05:00 (noon on 10 October 2002,
Central Daylight Savings Time as well as Eastern Standard Time in the U.S.)
is equal to 2002-10-10T17:00:00Z, five hours later than 2002-10-10T12:00:00Z.
поэтому, исходя из моего понимания, мне нужно найти свое местное время по новой дате (), а затем использовать getTimezoneOffset() функция для вычисления разницы затем прикрепить его к концу строки.
1.Получить местное время с форматом
var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)
выход
2013-07-02T09:00:00
2.Получить смещение времени UTC на час
var offset = local.getTimezoneOffset() / 60;
выход
7
3.Построить URL (только часть времени)
var duration = local + "-" + offset + ":00";
выход:
2013-07-02T09:00:00-7:00
выше вывод означает, что мое местное время 2013/07/02 9 утра и разница от UTC на 7 часов (UTC на 7 часов опережает местное время)
пока это, кажется, работает, но что делать, если getTimezoneOffset() возвращает отрицательное значение, например -120?
мне интересно, как формат должен выглядеть в таком случае, потому что я не могу понять, из документов W3C. Спасибо заранее.
3 ответов:
ниже должно работать правильно, и для всех браузеров (спасибо @MattJohnson за подсказку)
Date.prototype.toIsoString = function() { var tzo = -this.getTimezoneOffset(), dif = tzo >= 0 ? '+' : '-', pad = function(num) { var norm = Math.floor(Math.abs(num)); return (norm < 10 ? '0' : '') + norm; }; return this.getFullYear() + '-' + pad(this.getMonth() + 1) + '-' + pad(this.getDate()) + 'T' + pad(this.getHours()) + ':' + pad(this.getMinutes()) + ':' + pad(this.getSeconds()) + dif + pad(tzo / 60) + ':' + pad(tzo % 60); } var dt = new Date(); console.log(dt.toIsoString());
getTimezoneOffset()возвращает противоположный знак формата, необходимого для спецификации, на которую вы ссылаетесь.этот формат также известен как в формате iso8601, или точнее как RFC3339.
в этом формате UTC представлен с
Zв то время как все другие форматы представлены смещением от UTC. Смысл тот же, что и у JavaScript, но порядок вычитания инвертирован, поэтому результат несет противоположный знак.также, нет никакого метода на родном
Dateобъектformat, так что ваша функция в #1 не будет работать, если вы не используете библиотеку для достижения этой цели. См.документация.если вы ищете библиотека, которая может работать с этим форматом напрямую, я рекомендую попробовать момент.js. По сути, это формат по умолчанию, так что вы можете просто сделать это:
var m = moment(); // get "now" as a moment var s = m.format(); // the ISO format is the default so no parameters are needed // sample output: 2013-07-01T17:55:13-07:00это хорошо протестированное кросс-браузерное решение и имеет много других полезных функций особенности.
Это моя функция для часового пояса клиентов, это облегченный вес и простой
function getCurrentDateTimeMySql() { var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, 19).replace('T', ' '); var mySqlDT = localISOTime; return mySqlDT; }
Comments