Actionscript 3 - Fastest way to parse yyyy-mm-dd hh:mm:ss to a Date object?
我一直在尝试找到一种将yyyy-mm-dd [hh:mm:ss]解析为Date对象的快速方法。 这是我尝试执行的3种方法,以及每种方法解析50,000个日期时间字符串所花费的时间。
有谁知道这样做的更快方法或加快方法的提示?
1 2 3
| castMethod1 takes 3673 ms
castMethod2 takes 3812 ms
castMethod3 takes 3931 ms |
码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| private function castMethod1(dateString:String):Date {
if ( dateString == null ) {
return null;
}
var year:int = int(dateString.substr(0,4));
var month:int = int(dateString.substr(5,2))-1;
var day:int = int(dateString.substr(8,2));
if ( year == 0 && month == 0 && day == 0 ) {
return null;
}
if ( dateString.length == 10 ) {
return new Date(year, month, day);
}
var hour:int = int(dateString.substr(11,2));
var minute:int = int(dateString.substr(14,2));
var second:int = int(dateString.substr(17,2));
return new Date(year, month, day, hour, minute, second);
} |
--
1 2 3 4 5 6 7 8 9 10 11 12 13
| private function castMethod2(dateString:String):Date {
if ( dateString == null ) {
return null;
}
if ( dateString.indexOf("0000-00-00") != -1 ) {
return null;
}
dateString = dateString.split("-").join("/");
return new Date(Date.parse( dateString ));
} |
--
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private function castMethod3(dateString:String):Date {
if ( dateString == null ) {
return null;
}
var mainParts:Array = dateString.split("");
var dateParts:Array = mainParts[0].split("-");
if ( Number(dateParts[0])+Number(dateParts[1])+Number(dateParts[2]) == 0 ) {
return null;
}
return new Date( Date.parse( dateParts.join("/")+(mainParts[1]?""+mainParts[1]:"") ) );
} |
不,默认情况下,Date.parse将不处理破折号。 而且我需要为"0000-00-00"之类的日期时间字符串返回null。
我一直在使用以下代码片段来解析UTC日期字符串:
1 2 3 4 5 6 7 8 9 10
| private function parseUTCDate( str : String ) : Date {
var matches : Array = str.match(/(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d)Z/);
var d : Date = new Date();
d.setUTCFullYear(int(matches[1]), int(matches[2]) - 1, int(matches[3]));
d.setUTCHours(int(matches[4]), int(matches[5]), int(matches[6]), 0);
return d;
} |
只需删除时间部分,它就可以很好地满足您的需求:
1 2 3 4 5 6 7 8 9
| private function parseDate( str : String ) : Date {
var matches : Array = str.match(/(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/);
var d : Date = new Date();
d.setUTCFullYear(int(matches[1]), int(matches[2]) - 1, int(matches[3]));
return d;
} |
不知道速度,我在我的应用程序中对此并不担心。 strike>在我的机器上,不到50秒的迭代就可以进行50K迭代。
经过一番摆弄之后,这是我能想到的最快的方法:
1 2 3 4 5 6 7 8 9 10 11
| private function castMethod4(dateString:String):Date {
if ( dateString == null )
return null;
if ( dateString.length != 10 && dateString.length != 19)
return null;
dateString = dateString.replace("-","/");
dateString = dateString.replace("-","/");
return new Date(Date.parse( dateString ));
} |
对于计算机上的castMethod2(),我在大约470毫秒内获得了5万次迭代,而对于我的版本,我得到了300毫秒的迭代(这是在63%的时间内完成的工作量相同)。除非您要分析大量的日期,否则我肯定会说两者都"足够好"。
我猜Date.Parse()不起作用?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| var strDate:String ="2013-01-24 01:02:40";
function dateParser(s:String):Date{
var regexp:RegExp = /(\\d{4})\\-(\\d{1,2})\\-(\\d{1,2}) (\\d{2})\\:(\\d{2})\\:(\\d{2})/;
var _result:Object = regexp.exec(s);
return new Date(
parseInt(_result[1]),
parseInt(_result[2])-1,
parseInt(_result[3]),
parseInt(_result[4]),
parseInt(_result[5]),
parseInt(_result[6])
);
}
var myDate:Date = dateParser(strDate); |
由于Date.parse()不能接受所有可能的格式,因此我们可以使用DateFormatter和Data.parse()可以理解的formatString对传递的dateString值进行预格式化,例如
1 2 3 4 5 6 7
| // English formatter
var stringValue ="2010.10.06"
var dateCommonFormatter : DateFormatter = new DateFormatter();
dateCommonFormatter.formatString ="YYYY/MM/DD";
var formattedStringValue : String = dateCommonFormatter.format(stringValue);
var dateFromString : Date = new Date(Date.parse(formattedStringValue)); |
那么方法2似乎是最好的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13
| private function castMethod2(dateString:String):Date {
if ( dateString == null ) {
return null;
}
if ( dateString.indexOf("0000-00-00") != -1 ) {
return null;
}
dateString = dateString.split("-").join("/");
return new Date(Date.parse( dateString ));
} |
这是我的实现。试试看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public static function dateToUtcTime(date:Date):String {
var tmp:Array = new Array();
var char:String;
var output:String = '';
// create format YYMMDDhhmmssZ
// ensure 2 digits are used for each format entry, so 0x00 suffuxed at each byte
tmp.push(date.secondsUTC);
tmp.push(date.minutesUTC);
tmp.push(date.hoursUTC);
tmp.push(date.getUTCDate());
tmp.push(date.getUTCMonth() + 1); // months 0-11
tmp.push(date.getUTCFullYear() % 100);
for(var i:int=0; i < 6/* 7 items pushed*/; ++i) {
char = String(tmp.pop());
trace("char:" + char);
if(char.length < 2)
output +="0";
output += char;
}
output += 'Z';
return output;
} |
|