Вопрос по javascript, timezone-offset, datetime – javascript toISOString () игнорирует смещение часового пояса

90

Я пытаюсь преобразовать дату и время в Твиттере в локальную iso-строку (для prettyDate) уже 2 дня. Я просто не правильно понимаю местное время.

я использую следующую функцию:

function getLocalISOTime(twDate) {
    var d = new Date(twDate);
    var utcd = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(),
        d.getMinutes(), d.getSeconds(), d.getMilliseconds());

    // obtain local UTC offset and convert to msec
    localOffset = d.getTimezoneOffset() * 60000;
    var newdate = new Date(utcd + localOffset);
    return newdate.toISOString().replace(".000", "");
}

в newdate все в порядке, но toISOString () снова возвращает его в исходное время ... Кто-нибудь может мне помочь получить местное время в iso из Twitterdate в формате: Четверг, 31 мая 2012 г. 08:33:41 +0000

Формат, который вы описываете в конце, неISO-8601E формат (см. такжеDate.toISOString, Вы можете легко достичь желаемого формата; это очень близко к тому, что вы получаете сdateObj.toString(), Попробуйте поиграть с этим. Zirak
@Bergi: как ни парадоксально, старый вопрос не может быть дубликатом более нового;) JFK
Спасибо! Заканчивается этим: var d = new Date (twDate); вернуть новую дату (d.toISOString (). replace ("Z", "-02: 00")). toISOString (). replace (".000", ""); Не самое красивое решение, но работает для моего часового пояса. Cyril Mestrom

Ваш Ответ

4   ответа
6

moment.js FTW !!!

Просто конвертируйте свою дату в момент и манипулируйте ею, как вам угодно:

var d = new Date(twDate);
var m = moment(d).format();
console.log(m);
// example output:
// 2016-01-08T00:00:00-06:00

http://momentjs.com/docs/

Это неправильный ответ ... Можете ли вы дать правильный ответ, используя Moment.js? Если это реальный ответ, я могу ответить каждый раз x86 FTW !!!intel.com/content/dam/www/public/us/en/documents/manuals/… & Quot; и сказать удачи ...
7

Эта функция даты ниже обеспечивает желаемый эффект без дополнительной библиотеки скриптов. По сути, это просто простая конкатенация компонента даты в правильном формате и расширение прототипа объекта Date.

 Date.prototype.dateToISO8601String  = function() {
    var padDigits = function padDigits(numb,er, digits) {
        return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
    }
    var offsetMinutes = this.getTimezoneOffset();
    var offsetHours = offsetMinutes / 60;
    var offset= "Z";    
    if (offsetHours < 0)
      offset = "-" + padDigits(offsetHours.replace("-","") + "00",4);
    else if (offsetHours > 0) 
      offset = "+" + padDigits(offsetHours  + "00", 4);

    return this.getFullYear() 
            + "-" + padDigits((this.getUTCMonth()+1),2) 
            + "-" + padDigits(this.getUTCDate(),2) 
            + "T" 
            + padDigits(this.getUTCHours(),2)
            + ":" + padDigits(this.getUTCMinutes(),2)
            + ":" + padDigits(this.getUTCSeconds(),2)
            + "." + padDigits(this.getUTCMilliseconds(),2)
            + offset;

}

Date.dateFromISO8601 = function(isoDateString) {
      var parts = isoDateString.match(/\d+/g);
      var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
      var isoDate = new Date(isoTime);
      return isoDate;       
}

function test() {
    var dIn = new Date();
    var isoDateString = dIn.dateToISO8601String();
    var dOut = Date.dateFromISO8601(isoDateString);
    var dInStr = dIn.toUTCString();
    var dOutStr = dOut.toUTCString();
    console.log("Dates are equal: " + (dInStr == dOutStr));
}

Использование:

var d = new Date();
console.log(d.dateToISO8601String());

Надеюсь, это поможет кому-то еще.

РЕДАКТИРОВАТЬ

Исправленная проблема UTC, упомянутая в комментариях, и кредитAlex дляdateFromISO8601 функция.

это неправильно и не работает я боюсь
Сочетание со смещением местного часового пояса уже происходит в объекте даты. Вотjsfiddle это иллюстрирует это. Если вы просто хотите локальную строку, то просто создайте ее с частями даты в конкатенации.
И теперь вы получаете значения UTC, но объединяете их с местным смещением часового пояса?
это помогло мне, и я думаю, что это лучший ответ.
В то время как вы получаете правильное местное время, вы неправильно связываете это время с временем зулуса, добавляя & quot; Z & quot; вместо часового пояса. Если бы вы взяли время, созданное из этого, и поместили его в любое приложение, соответствующее ISO, вы быnot получить правильное время взамен. Вам следует позвонить.getTimezoneOffset() и затем вычислите минуты в формате часов вместо этого, чтобы ваша дата ISO соответствовала.
168

moment.js это здорово, но иногда вы не хотите тянуть большое количество зависимостей для простых вещей.

Также работает следующее:

var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
// => '2015-01-26T06:40:36.181'

slice(0, -1) избавляется от отставанияZ который представляет часовой пояс Зулу и может быть заменен вашим собственным.

коротко и просто - блестяще! Чтобы сделать его более читабельным для человека, я добавил .toISOString (). Slice (0, -5) .replace ("T", ""); в конце вашего решения.
@NicoDura, и ваша функция имеет ошибку, она всегда возвращает текущую дату. Должно быть "d - tzoffset"
Время указывается в UTC (Всемирное координированное время) со специальным обозначением UTC («Z»).
Отлично, спасибо. Вот как функция, которая принимает необязательный параметр даты: function localISOTime (d) {if (! D) d = new Date () var tzoffset = d.getTimezoneOffset () * 60000; // смещение в миллисекундах return (new Date (Date.now () - tzoffset)). toISOString (). slice (0, -1); }
Почему & quot; - & quot; (Ныне tzoffset)?
51

ени, добавить смещение часового пояса, затем преобразовать обратно в объект даты и затем запустить toISOString ().

var date = new Date(); // Or the date you'd like converted.
isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
Мне нравится этот подход. Ваш пример не работает как есть, потому что вы не определили дату. Если вы добавляете var date = new Date (); к вашему примеру, это работает.
отличное решение без использования библиотек, спасибо!
Красиво и очень просто. Спасибо. Просто примечание: он сохраняет "Z" в конце строки, что технически неверно, но легко редактируется.
оно работает! но я не понимаю, почему вы умножаете на 60000? : s
@betoharres, который должен преобразовывать смещение часового пояса в миллисекунды, в котором находится getTime.

Похожие вопросы