2012-05-31 2 views
58

Я пытаюсь преобразовать значение datetime Twitter в локальную iso-строку (для prettyDate) сейчас в течение 2 дней. Я просто не получить местное право время ..javascript toISOString() игнорирует смещение временной области

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

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

+2

Формат Вы описываете в конце не является форматом [ISO-8601E] (http://dotat.at/tmp/ISO_8601-2004_E.pdf) (см. также [Date.toISOString] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString). Вы можете легко получить желаемый формат, он очень близок к тому, что вы получаете с помощью 'dateObj.toString()'. Попробуйте сыграть с этим – Zirak

+0

Спасибо! Заканчивается: var d = new Дата (twDate); return new Date (d.toISOString(). replace ("Z", "-02: 00")). toISO String() заменить (". 000", ""); Не самое приятное решение, но работает для моего часового пояса. –

+0

Возможный дубликат [Есть ли способ создать это представление строковой даты (с часовым поясом) без использования функций подстроки javascript или регулярного выражения?] (Http://stackoverflow.com/questions/14992051/is-there-any-way – Bergi

ответ

117

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 который представляет Zulu часовой пояс и может быть заменен самостоятельно.

+4

короткий и простой - блестящий! Чтобы сделать его еще более понятным для человека, я ставлю .toISOString(). Slice (0, -5) .replace ("T", ""); в конце вашего решения. – DerWOK

+2

Время выражено в UTC (Coordinated Universal Time) со специальным обозначением UTC («Z»). –

+1

Отлично, спасибо. Здесь это функция, которая принимает необязательный параметр даты: Функция localISOTime (d) { if (! D) d = новая дата() var tzoffset = d.getTimezoneOffset() * 60000; // offset в миллисекундах return (новая дата (Date.now() - tzoffset)). toISOString(). slice (0, -1); } – Nico

6

moment.js FTW !!!

Просто преобразовать дату в данный момент и манипулировать ею, однако, пожалуйста:

var d = new Date(twDate); 
var m = moment(d).format(); 
console.log(m); 

http://momentjs.com/docs/

+0

Это не правильный ответ ...Можете ли вы дать правильный ответ, используя Moment.js? Если это реальный ответ, я могу каждый раз отвечать «x86 FTW !!! https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures- Software-Developer-инструкция-set-reference-manual-325383.pdf "и сказать, удачи ... – DestyNova

+0

[* Когда« использовать jQuery »не является допустимым ответом на вопрос JavaScript?] (https: // meta. stackoverflow.com/questions/335328/when-is-use-jquery-not-a-valid-answer-to-a-javascript-question) – RobG

5

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

Date.prototype.dateToISO8601String = function() { 
    var padDigits = function padDigits(number, 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()); 

Надеется, что это помогает кто-то другое.

EDIT

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

+0

Это помогло мне, и я думаю, что это лучший ответ. – Jonathan

+1

Пока вы получаете правильное местное время, вы неправильно связываете это время с временем zulu, добавляя «Z» вместо часовой пояс. Если бы вы потратили время, созданное из этого, и поместили его в любое соответствующее ISO-приложение, вы бы * не * получили правильное время взамен. Вы должны вызвать '.getTimezoneOffset()', а затем вычислить минуты в формате часов вместо этого, чтобы ваша дата ISO соответствовала. –

+0

это неправильно и не работает Im fear –

26

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

var date = new Date(); // Or the date you'd like converted. 
isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString(); 
+1

Мне нравится этот подход. Вы, например, не работаете, потому что вы не определили дату. Если вы добавили var date = new Date(); к вашему примеру, он работает. – Brady

 Смежные вопросы

  • Нет связанных вопросов^_^