regexp解析ISO-8601

时间:2011-11-25 12:46:12

标签: javascript regex date

作为我想要帮助的问题的后续问题:javascript date.parse difference in chrome and other browsers

我需要帮助更新我在这里找到的正则表达式:

JavaScript: Which browsers support parsing of ISO-8601 Date String with Date.parse

处理2011-11-24T09:00:27+0200

目前只应该处理ISO日期的2011-11-24T09:00:27Z版本

即。

中的rx
function(s){
    var day, tz, 
    rx= /^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/, 
    p= rx.exec(s) || [];
    if(p[1]){
        day= p[1].split(/\D/).map(function(itm){
            return parseInt(itm, 10) || 0;
        });
        day[1]-= 1;
        day= new Date(Date.UTC.apply(Date, day));
        if(!day.getDate()) return NaN;
        if(p[5]){
            tz= parseInt(p[5], 10)*60;
            if(p[6]) tz += parseInt(p[6], 10);
            if(p[4]== "+") tz*= -1;
            if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
        }
        return day;
    }
    return NaN;
}

使this fiddle能够与IE和Safari一起使用


更新:答案有效。现在我可以帮助其他人解析从facebook API返回的ISO日期。

2 个答案:

答案 0 :(得分:12)

要使其适用格式2011-11-24T09:00:27+0200的日期,只需在最后?之后添加:,例如:

/^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):?(\d\d))?$/

说明:

  (
    \d{4}\-\d\d\-\d\d     # date
    ([tT][\d:\.]*)?       # optional time
  )
  (
    [zZ]                  # UTC time zone
    |                     # or
    ([+\-])               # offset sign
    (\d\d)                # hour offset
    :?                    # optional delimiter
    (\d\d)                # minute offset
  )?                      # time zone is optional             

其余的代码不需要任何更改,并且该函数以前支持的所有格式仍然有效(与之前的答案不同,它会打破四位数偏移)。

答案 1 :(得分:2)

我不确定你想要什么,但你的正则表达式是错误的,尝试更改结尾,使它看起来像/^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d{3}))?$/,它至少会匹配你正在寻找的东西。

原始正则表达式查找了一个字符,zZ,或+-后跟2位数字,冒号,然后是2位数字,我更改了它,而不是寻找2位数,一个冒号和2位数,它在你的例子中寻找3位数。