如何在JavaScript中输出ISO 8601格式的string?

我有一个Date对象。 如何渲染以下代码片段的title部分?

 <abbr title="2010-04-02T14:12:07">A couple days ago</abbr> 

我有另一个图书馆的“相对时间”字样。

我已经尝试了以下内容:

 function isoDate(msSinceEpoch) { var d = new Date(msSinceEpoch); return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' + d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds(); } 

但是这给了我:

 "2010-4-2T3:19" 

已经有一个函数叫做toISOString()

 var date = new Date(); date.toISOString(); //"2011-12-19T15:28:46.493Z" 

如果,不知何故,你是在一个不支持它的浏览器 ,我已经涵盖了:

 if ( !Date.prototype.toISOString ) { ( function() { function pad(number) { var r = String(number); if ( r.length === 1 ) { r = '0' + r; } return r; } Date.prototype.toISOString = function() { return this.getUTCFullYear() + '-' + pad( this.getUTCMonth() + 1 ) + '-' + pad( this.getUTCDate() ) + 'T' + pad( this.getUTCHours() ) + ':' + pad( this.getUTCMinutes() ) + ':' + pad( this.getUTCSeconds() ) + '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) + 'Z'; }; }() ); } 

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Date

 /* Use a function for the exact format desired... */ function ISODateString(d) { function pad(n) {return n<10 ? '0'+n : n} return d.getUTCFullYear()+'-' + pad(d.getUTCMonth()+1)+'-' + pad(d.getUTCDate())+'T' + pad(d.getUTCHours())+':' + pad(d.getUTCMinutes())+':' + pad(d.getUTCSeconds())+'Z' } var d = new Date(); console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z 

在输出string之前,Web上的几乎每个to-ISO方法都会通过应用转换为“Z”uu时间(UTC)的方式来丢弃时区信息。 浏览器的原生.toISOString()也会删除时区信息。

这丢弃了有价值的信息,因为服务器或收件人可以始终将完整的ISOdate转换为Zulu时间或其所需的时区,同时仍然获得发件人的时区信息。

我遇到的最好的解决scheme是使用Moment.js JavaScript库,并使用下面的代码:

获取当前ISO时间和时区信息和毫秒

 now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ") // "2013-03-08T20:11:11.234+0100" now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ") // "2013-03-08T19:11:11.234+0000" now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z" // "2013-03-08T19:11:11Z" <- better use the native .toISOString() 

获取具有时区信息但没有毫秒的本地JavaScript Date对象的ISO时间

 var current_time = Date.now(); moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ") 

这可以与Date.js结合来获得像Date.today()这样的函数,其结果可以被传递到时刻。

像这样格式化的datestring是JSON编译器,可以很好地存储到数据库中。 Python和C#似乎喜欢它。

问的问题是ISO格式精度降低。 瞧:

  new Date().toISOString().slice(0, 19) + 'Z' // '2014-10-23T13:18:06Z' 

假设尾随Z是想要的,否则就省略。

如果你不需要支持IE7,下面是一个伟大的,简洁的黑客:

 JSON.parse(JSON.stringify(new Date())) 

Internet Explorer 8和更早版本最短但不受支持:

 new Date().toJSON() 

“T”后面有一个“+”

 isoDate: function(msSinceEpoch) { var d = new Date(msSinceEpoch); return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' + d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds(); } 

应该这样做。

对于前导零,你可以在这里使用它:

 function PadDigits(n, totalDigits) { n = n.toString(); var pd = ''; if (totalDigits > n.length) { for (i=0; i < (totalDigits-n.length); i++) { pd += '0'; } } return pd + n.toString(); } 

像这样使用它:

 PadDigits(d.getUTCHours(),2) 

我通常不想显示UTCdate,因为客户不喜欢进行转换。 要显示本地 ISOdate,我使用的function是:

 function toLocalIsoString(date, includeSeconds) { function pad(n) { return n < 10 ? '0' + n : n } var localIsoString = date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' + pad(date.getDate()) + 'T' + pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds()); if(date.getTimezoneOffset() == 0) localIsoString += 'Z'; return localIsoString; }; 

上面的函数省略了时区偏移信息(除非本地时间恰好是UTC),所以我使用下面的函数来显示单个位置的本地偏移量。 如果您希望每次都显示偏移量,您还可以将其输出追加到上述函数的结果中:

 function getOffsetFromUTC() { var offset = new Date().getTimezoneOffset(); return ((offset < 0 ? '+' : '-') + pad(Math.abs(offset / 60), 2) + pad(Math.abs(offset % 60), 2)) }; 

toLocalIsoString使用pad 。 如果需要的话,它可以像几乎所有的pad函数一样工作,但为了完整性,我使用这个函数:

 // Pad a number to length using padChar function pad(number, length, padChar) { if (typeof length === 'undefined') length = 2; if (typeof padChar === 'undefined') padChar = '0'; var str = "" + number; while (str.length < length) { str = padChar + str; } return str; } 

toISOString的问题是,它只给出了“Z”的date时间。

ISO-8601还以2016-07-16T19:20:30 + 5:30(当时区为UTC前)和2016-07-16T19:20:30-01 :00(当时区在UTC之后)。

我不认为使用另一个插件,moment.js来做这样一个小任务是一个不错的主意,特别是当你用几行代码来获得它的时候。

 var timezone_offset_min = new Date().getTimezoneOffset(), offset_hrs = parseInt(Math.abs(timezone_offset_min/60)), offset_min = Math.abs(timezone_offset_min%60), timezone_standard; if(offset_hrs < 10) offset_hrs = '0' + offset_hrs; if(offset_min > 10) offset_min = '0' + offset_min; // getTimezoneOffset returns an offset which is positive if the local timezone is behind UTC and vice-versa. // So add an opposite sign to the offset // If offset is 0, it means timezone is UTC if(timezone_offset_min < 0) timezone_standard = '+' + offset_hrs + ':' + offset_min; else if(timezone_offset_min > 0) timezone_standard = '-' + offset_hrs + ':' + offset_min; else if(timezone_offset_min == 0) timezone_standard = 'Z'; // Timezone difference in hours and minutes // String such as +5:30 or -6:00 or Z console.log(timezone_standard); 

一旦你有小时和分钟的时区偏移,你可以附加到date时间string。

我写了一篇博客文章: http : //usefulangle.com/post/30/javascript-get-date-time-with-offset-hours-minutes

我只是使用这个小扩展到Datehttp://blog.stevenlevithan.com/archives/date-time-format

 var date = new Date(msSinceEpoch); date.format("isoDateTime"); // 2007-06-09T17:46:21 

我能够以较less的代码获得低于输出。

 var ps = new Date('2010-04-02T14:12:07') ; ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs"; 

输出:

 Fri Apr 02 2010 19:42 hrs 
 function timeStr(d) { return ''+ d.getFullYear()+ ('0'+(d.getMonth()+1)).slice(-2)+ ('0'+d.getDate()).slice(-2)+ ('0'+d.getHours()).slice(-2)+ ('0'+d.getMinutes()).slice(-2)+ ('0'+d.getSeconds()).slice(-2); } 
 function getdatetime() { d = new Date(); return (1e3-~d.getUTCMonth()*10+d.toUTCString()+1e3+d/1) .replace(/1(..)..*?(\d+)\D+(\d+).(\S+).*(...)/,'$3-$1-$2T$4.$5Z') .replace(/-(\d)T/,'-0$1T'); } 

我发现堆栈溢出的基础(我相信它是其他一些堆栈交换代码打高尔夫球的一部分),我改进了它,所以它也适用于Internet Explorer 10或更早版本。 这是丑陋的,但它完成了工作。