动作3-将yyyy-mm-dd hh:mm:ss解析为Date对象的最快方法?
时间:2020-03-05 18:37:58 来源:igfitidea点击:
我一直在尝试找到一种将yyyy-mm-dd [hh:mm:ss]解析为Date对象的快速方法。这是我尝试执行的3种方法,以及每种方法解析50,000个日期时间字符串所花费的时间。
有谁知道执行此操作的更快方法或者加快方法的提示?
castMethod1 takes 3673 ms castMethod2 takes 3812 ms castMethod3 takes 3931 ms
代码:
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); }
--
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 )); }
--
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。
解决方案
回答
我猜Date.Parse()不起作用?
回答
那么方法2似乎是最好的方法:
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 )); }
回答
经过一番摆弄之后,这是我能想到的最快的方法:
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%的时间所完成的工作量)。除非我们要分析大量的日期,否则我肯定会说两者都"足够好"。
回答
我一直在使用以下代码片段来解析UTC日期字符串:
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; }
只需删除时间部分,它就可以很好地满足需求:
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; }
不知道速度,我没有担心我的应用程序中的速度。在我的机器上进行50K迭代的时间大大少于一秒钟。
回答
由于Date.parse()不能接受所有可能的格式,因此我们可以使用DateFormatter和Data.parse()可以理解的formatString对传递的dateString值进行预格式化,例如
// 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));