Как 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. Спасибо заранее.

770   3  

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

    Ничего не найдено.