Actionscript 3 - 将 yyyy-mm-dd hh:mm:ss 解析为 Date 对象的最快方法?
Posted
技术标签:
【中文标题】Actionscript 3 - 将 yyyy-mm-dd hh:mm:ss 解析为 Date 对象的最快方法?【英文标题】:Actionscript 3 - Fastest way to parse yyyy-mm-dd hh:mm:ss to a Date object? 【发布时间】:2010-09-05 09:55:39 【问题描述】:我一直在尝试找到一种非常快速的方法来将 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。
【问题讨论】:
【参考方案1】:我一直在使用以下代码片段来解析 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 次迭代。
【讨论】:
请告诉我们 3 个示例函数进行 50K 次迭代需要多长时间,以便我们可以正确看待您的“不到一秒”。 我想知道如果你用 const 关键字替换 var 匹配和 d 会有任何额外的性能。【参考方案2】:这是经过一番摆弄后我能想到的最快的:
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 毫秒内完成了 50k 次迭代,而我的版本在 300 毫秒内完成了迭代(这与 63% 的时间完成的工作量相同)。我肯定会说两者都“足够好”,除非您要解析大量的日期。
【讨论】:
【参考方案3】:我猜 Date.Parse() 不起作用?
【讨论】:
【参考方案4】:那么方法 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 ));
【讨论】:
【参考方案5】:因为 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));
【讨论】:
我们可以使用DateFormatter.parseDateString()
,而不是执行这两个步骤。【参考方案6】:
var strDate:String = "2013-01-24 01:02:40";
function dateParser(s:String):Date
var regexp:RegExp = /(\d4)\-(\d1,2)\-(\d1,2) (\d2)\:(\d2)\:(\d2)/;
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);
【讨论】:
【参考方案7】:这是我的实现。试试这个。
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;
【讨论】:
以上是关于Actionscript 3 - 将 yyyy-mm-dd hh:mm:ss 解析为 Date 对象的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 actionscript 2 代码转换为 actionscript 3?
将 Actionscript 2 转换为 Actionscript 3
将 ActionScript 2 SWF 转换为 ActionScript 3 SWF 文件(可以剥离代码)