javascript toISOString()忽略时区偏移量

我正在尝试将Twitter的date时间转换为本地的iso-string(for prettyDate)现在为2天。 我只是没有得到当地的时间。

即时通讯使用以下function:

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", ""); } 

在新date一切正常,但toISOString()把它扔回到原来的时间再次…任何人都可以帮助我从当地的时间在ISO格式为:2012年5月31日星期四08:33:41 +0000

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 ,可由您自己replace。

我没有使用时刻的解决scheme是将其转换为时间戳,添加时区偏移量,然后转换回date对象,然后运行toISOString()

 isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString(); 

moment.js FTW !!!

只要将你的date转换为片刻,然后操纵它,

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

http://momentjs.com/docs/

下面的这个date函数在没有附加脚本库的情况下达到了预期的效果。 基本上它只是一个简单的date组件连接在正确的格式,并扩大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()); 

希望这可以帮助别人。

编辑

更正了在注释中提到的UTC问题,并将date从dateFromISO8601函数中dateFromISO8601