正则表达式解析ISO-8601格式

5
作为我正在协助解答的问题的后续: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日期。


4
你尝试了什么?这个网站不应该是为了让别人免费为你工作。 - Evert
1
+1:必须说这是一个不必要的负评! - naveen
4
我认为这是一个合理的问题。他是一位有数百个答案的万分用户,所以我觉得你的评论有点不公平。 - Michael Low
10K并不意味着他不会犯错 :) 每次我打开未回答的页面,都有很多“为我编写正则表达式”的类型问题。我倾向于对这些进行投票。 - Evert
4
@Evert - 我都试了些什么?显然,我试图帮助另一个SO用户,a) 找到了几乎可行的代码,b) 创建了一个fiddle并将其更改为支持Firefox,c) 发现IE和Safari的正则表达式不适用于特定字符串, d) 请求SO社区帮助在正则表达式中添加4个字符。如果你不想帮忙,没关系 - 你可以忽略这个问题。如果我完全知道如何做,我就不会请求帮助! - mplungjan
显示剩余3条评论
2个回答

13
为了使其与格式为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             

代码的其余部分不应该需要进行任何更改,并且函数之前支持的所有格式仍将继续工作(与先前的答案不同,该答案会破坏四位数的偏移量)。


这是程序相关内容的翻译:这是一个打字错误,应该是+0200。 - mplungjan
@mplungjan,已更新答案以反映您修改后的问题。遗憾的是,在JavaScript中不支持 /x,但在大多数其他语言中都可以使用。 - Qtax

2
我不确定您想要什么,但是您的正则表达式是错误的,请尝试更改结尾,使其看起来像这样/^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d{3}))?$/,它将至少匹配您要查找的内容。
原始的正则表达式寻找一个字符,即zZ,或者一个+-后跟两个数字,一个冒号,然后再跟两个数字。我将其更改为寻找三个数字,就像您的示例中所示。

谢谢你的帮助。现在我可以帮助别人了。这是一个有用的脚本,因为它处理了从Facebook API返回的ISO日期。 - mplungjan
这会破坏先前支持的格式。例如,2011-11-24T09:00:27+02将不再解析。 - Qtax
我希望我能够分割答案。 - mplungjan
@mplungjan 没问题,Qtax的回答更好,这就是为什么我给了它+1。 - Blem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接