在Javascript中解析ISO 8601日期

Sly*_*hic 54 javascript formatting datetime iso8601

需要有关将具有以下结构的ISO 8601日期转换为javascript的帮助/提示.

CCYY-MM-DDThh:mm:ssTZD
Run Code Online (Sandbox Code Playgroud)

我想照这样的日期:

January 28, 2011 - 7:30PM EST
Run Code Online (Sandbox Code Playgroud)

我想让这个解决方案尽可能干净简洁.

Rob*_*ans 70

Date对象处理8601作为它的第一个参数:

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

  • 并非在所有浏览器中.请记住,ECMA规范对于Date()的参数格式是否仍然模糊不清.这就是为什么即使IE11也无法处理你的建议. (7认同)
  • @RenéStalder刚刚在Win7上测试了IE9,它也在那里工作.实际上到目前为止我还没有找到一个不支持它的浏览器. (6认同)
  • 在 IE 9 中不起作用:肯定是 Quirks 模式。我们中的一些人需要浏览器兼容性。 (2认同)
  • 在ES5之前,日期解析依赖于实现.旧浏览器将显示不一致的结果. (2认同)

YOU*_*YOU 29

datejs可以解析下面的内容,你可能想尝试一下.

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

编辑:正则表达式版本

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
    }
)
Run Code Online (Sandbox Code Playgroud)

结果

January 28, 2011 - 7:30PM EST
Run Code Online (Sandbox Code Playgroud)

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}):[^(]+\(([A-Z]{3})\)/,
    function($0,$1,$2,$3,$4,$5,$6){
        return MM[$1]+" "+$2+", "+$3+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6 
    }
)
Run Code Online (Sandbox Code Playgroud)

返回

January 28, 2011 - 7:30PM EST
Run Code Online (Sandbox Code Playgroud)

基本上

String(new Date(x))
Run Code Online (Sandbox Code Playgroud)

返回

Fri Jan 28 2011 19:30:00 GMT-0500 (EST)
Run Code Online (Sandbox Code Playgroud)

正则表达式部分只是将上面的字符串转换为您需要的格式.

January 28, 2011 - 7:30PM EST
Run Code Online (Sandbox Code Playgroud)


Cia*_*tic 14

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

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);
}
Run Code Online (Sandbox Code Playgroud)

注意 parseFloat是必须的,parseInt并不总是有效.地图需要IE9或更高版本.

适用于格式:

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

对时区无效,请参阅其他答案.

  • +1简单便携.我做了这个改变,将日期解释为UTC:`返回新日期(Date.UTC(dt [0],dt [1] - 1,dt [2],dt [3] || 0,dt [4] || 0,dt [5] || 0,0));` (3认同)