我有以下代码:
function parseDate(s) {
var date = new Date(s);
if (!isValidDate(date)) {
//iso 860 date parser, as some browsers do not support this via new Date yet
var re=/(\d\d\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d\D?(\d\d\.?(\d*))?)(Z|[+-]\d\d?(:\d\d)?)?/;
var a=re(s).slice(1).map(function(x,i){
if (i==6 && x) x=parseInt(x,10)/Math.pow(10,x.length)*1000; // convert to milliseconds
return parseInt(x,10)||0;
});
date = new Date(Date.UTC(a[0],a[1]-1,a[2],a[3]-(a[7]||0),a[4],a[5],a[6]));
}
return date;
};
function isValidDate(d) {
if ( Object.prototype.toString.call(d) !== "[object Date]" )
return false;
return !isNaN(d.getTime());
}这在除IE6-9之外的所有浏览器中都有效。在这里我得到了错误:
SCRIPT5002:需要函数
它指向这条线:
var a=re(s).slice(1).map(function(x,i){有人知道这出了什么问题以及如何修复它吗?
谢谢,韦斯利
编辑:
如果我把代码改成这样:
function parseDate(s) {
var date = new Date(s);
if (!isValidDate(date)) {
//iso 860 date parser, as some browsers do not support this via new Date yet
var re=/(\d\d\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d)\D?(\d\d\D?(\d\d\.?(\d*))?)(Z|[+-]\d\d?(:\d\d)?)?/;
var a = re.exec(s);
if (a) {
a = a.slice(1);
a.map(function(x,i){
if (i==6 && x) x=parseInt(x,10)/Math.pow(10,x.length)*1000; // convert to milliseconds
return parseInt(x,10)||0;
});
document.getElementById('test1').innerHTML = (a[0] + ' ' + a[1] + ' ' + a[2] + ' ' + a[3] + ' ' + a[4] + ' ' + a[5] + ' ' + a[6] + ' ' + a[7]);
date = new Date(Date.UTC(a[0],a[1]-1,a[2],a[3]-(a[7]||0),a[4],a[5],a[6]));
}
}
return date;
};它仍然不能工作(抱怨IE中的.map ),但有趣的是,它在safari (也许还有其他浏览器)中也不能工作。有什么原因吗?
您将注意到输出(新函数的document.write为:
2008 11 01 20 39:57.78 57.78 78 -06:00
来自旧函数:
2008 11 1 20 39 57 780 -6
发布于 2011-07-03 12:39:02
关于.map
.map()数组方法是ECMAScript 5提供的新功能之一;它是JavaScript的最新官方版本(2009年12月为5.0,2011年6月为5.1 )。几乎没有(如果有的话)浏览器完全支持版本5(当然不是IE6)。可以肯定的是,在依赖浏览器支持所有新功能(如Array.map())之前,还需要一段时间。
关于日期正则表达式
遗憾的是,JavaScript不允许使用自由空格模式指定正则表达式。这使得像这样的长正则表达式很难读懂。为了阐明算法不起作用的原因,我在您的正则表达式中添加了注释,这些注释指出了捕获组真正捕获的内容。下面是PHP语法:
$re_iso8601_date_needs_work = '%# Original Date regex
(\d\d\d\d)\D? # $1: Year.
(\d\d)\D? # $2: Month.
(\d\d)\D? # $3: Day.
(\d\d)\D? # $4: Hour.
( # $5: Minute and second. ???
\d\d\D? # Minute.
( # $6: Optional second.
\d\d\.? # Second (whole portion).
(\d*) # $7: Second (fractional portion).
)? # Second is optional.
) # End $5: minute and second.
( # $8: Optional timezone alternatives.
Z # Either UTC/Zulu.
| [+-]\d\d? # Or offset from UTC. Hours and
(:\d\d)? # $9: optional minutes.
)? # Timezone is optional.%x';提示:小数秒的单位是$7,而不是$6。为什么要在组$5中同时捕获分钟和秒
希望这能有所帮助!:)
发布于 2011-06-30 22:01:34
根据regular-expressions.info的说法,你应该使用re.exec(s)而不是re(s)。该页面还提到了re.test(s),但这只是返回true或false,re.exec(s)实际上返回了匹配,这似乎就是您想要的结果。
https://stackoverflow.com/questions/6535774
复制相似问题