在Javascript中帮助parsingISO 8601date

需要关于将具有以下结构的ISO 8601date转换为javascript的帮助/提示。

CCYY-MM-DDThh:mm:ssTZD 

我想要这样的date:

 January 28, 2011 - 7:30PM EST 

我想保持这个解决scheme尽可能干净和最小化。 如果你需要其他的东西,请让我知道! 谢谢!

datejs可以parsing下面,你可能想尝试。

 Date.parse('1997-07-16T19:20:15') // ISO 8601 Formats Date.parse('1997-07-16T19:20:30+01:00') // ISO 8601 with Timezone offset 

编辑:正则expression式版本

 x = "2011-01-28T19:30:00EST" MM = ["January", "February","March","April","May","June","July","August","September","October","November", "December"] xx = x.replace( /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):\d{2}(\w{3})/, function($0,$1,$2,$3,$4,$5,$6){ return MM[$2-1]+" "+$3+", "+$1+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6 } ) 

结果

 January 28, 2011 - 7:30PM EST 

Edit2:我改变了我的时区到EST,现在我得到了以下

 x = "2011-01-28T19:30:00-05:00" MM = {Jan:"January", Feb:"February", Mar:"March", Apr:"April", May:"May", Jun:"June", Jul:"July", Aug:"August", Sep:"September", Oct:"October", Nov:"November", Dec:"December"} xx = String(new Date(x)).replace( /\w{3} (\w{3}) (\d{2}) (\d{4}) (\d{2}):(\d{2}):[^(]+\(([AZ]{3})\)/, function($0,$1,$2,$3,$4,$5,$6){ return MM[$1]+" "+$2+", "+$3+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6 } ) 

返回

 January 28, 2011 - 7:30PM EST 

基本上

 String(new Date(x)) 

返回

 Fri Jan 28 2011 19:30:00 GMT-0500 (EST) 

正则expression式部分只是将上面的string转换为您所需的格式。

 January 28, 2011 - 7:30PM EST 

Date对象处理8601,因为它是第一个参数:

 var d = new Date("2014-04-07T13:58:10.104Z"); console.log(d.toString()); 

如果你想保持简单,这应该足够了:

 function parseIsoDatetime(dtstr) { var dt = dtstr.split(/[: T-]/).map(parseFloat); return new Date(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0); } 

注意 parseFloat是必须的,parseInt不总是工作。 地图需要IE9或更高版本。

适用于格式:

  • 2014-12-28 15:30:30
  • 2014-12-28T15:30:30
  • 情节中字

不适用于时区,请参阅有关这些的其他答案。

也许,你可以使用moment.js在我看来是最好的JavaScript库来parsing,格式化和处理date客户端。 你可以使用像这样的东西:

 var momentDate = moment('1890-09-30T23:59:59+01:16:20', 'YYYY-MM-DDTHH:mm:ss+-HH:mm:ss'); var jsDate = momentDate.toDate(); // Now, you can run any JavaScript Date method jsDate.toLocaleString(); 

根据MSDN的说法,JavaScript Date对象没有提供任何特定的date格式化方法(就像你可能看到的其他编程语言一样)。 但是,您可以使用一些Date方法和格式来实现您的目标:

 function dateToString (date) { // Use an array to format the month numbers var months = [ "January", "February", "March", ... ]; // Use an object to format the timezone identifiers var timeZones = { "360": "EST", ... }; var month = months[date.getMonth()]; var day = date.getDate(); var year = date.getFullYear(); var hours = date.getHours(); var minutes = date.getMinutes(); var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM"); var timezone = timeZones[date.getTimezoneOffset()]; // Returns formatted date as string (eg January 28, 2011 - 7:30PM EST) return month + " " + day + ", " + year + " - " + time + " " + timezone; } var date = new Date("2011-01-28T19:30:00-05:00"); alert(dateToString(date)); 

你甚至可以更进一步,重写Date.toString()方法:

 function dateToString () { // No date argument this time // Use an array to format the month numbers var months = [ "January", "February", "March", ... ]; // Use an object to format the timezone identifiers var timeZones = { "360": "EST", ... }; var month = months[*this*.getMonth()]; var day = *this*.getDate(); var year = *this*.getFullYear(); var hours = *this*.getHours(); var minutes = *this*.getMinutes(); var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM"); var timezone = timeZones[*this*.getTimezoneOffset()]; // Returns formatted date as string (eg January 28, 2011 - 7:30PM EST) return month + " " + day + ", " + year + " - " + time + " " + timezone; } var date = new Date("2011-01-28T19:30:00-05:00"); Date.prototype.toString = dateToString; alert(date.toString());