2012-05-31 135 views
58

我试图将Twitter日期时间转换为本地的iso-string(for prettyDate)现在为2天。我只是没有得到本地时间正确使用下面的函数..javascript toISOString()忽略时区偏移量

IM:

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()再次抛出回原来的时间... 谁能帮我把本地时间从Twitterdate ISO格式为: 星期四,2012 5月31日8时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 Date(twDate); return new Date(d.toISOString()。replace(“Z”,“-02:00”))。toISO String()。replace(“。000”,“”);不是最漂亮的解决方案,但适用于我的时区。 –

+0

可能的重复[有什么办法来产生这个字符串日期表示(与时区),而不使用JavaScript的子字符串函数或正则表达式?](http://stackoverflow.com/questions/14992051/is-there-any-way -to-produce-this-string-date-representation-with-time-zone-wit) – 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代表祖鲁时区,可以通过自己的所取代的。

+4

短而简单 - 辉煌!为了使它更易读,我把.toISOString()。slice(0,-5).replace(“T”,“”);在解决方案的最后。 – DerWOK

+2

时间以UTC(协调世界时)表示,带有特殊的UTC指示符(“Z”)。 –

+1

非常好,谢谢。 ()d = new Date() var tzoffset = d.getTimezoneOffset()* 60000;这个函数使用可选的日期参数: 函数localISISime(d){012dif(!d)d = new Date //以毫秒为单位的偏移 return(new Date(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-软件开发指令集参考手册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()); 

希望这可以帮助其他人。在评论中提到

编辑

修正UTC的问题,信贷AlexdateFromISO8601功能。

+0

这帮助了我,我认为这是一个更好的答案。 – Jonathan

+1

当您获得正确的本地时间时,通过添加“Z”代替时区,您不正确地将该时间与祖鲁时间关联。如果您要花时间创建并将其放入任何符合ISO标准的应用程序中,您将不会获得正确的时间作为回报。您应该调用'.getTimezoneOffset()',然后将分钟计算为小时格式以代替该格式,以便您的ISO日期符合要求。 –

+0

多数民众赞成在错误和不工作恐怕 –

26

我不使用那一刻的解决方案是将其转换为一个时间戳,添加时区偏移,然后再转换回Date对象,然后运行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