2008-08-06 12 views
19

私は、yyyy-mm-dd [hh:mm:ss]を解析してDateオブジェクトにする本当に高速な方法を見つけようとしています。ここで私がそれをやってみた3つの方法と、それぞれのメソッドが50,000の日付文字列を解析するのにかかる時間です。Actionscript 3 - yyyy-mm-dd hh:mm:ssをDateオブジェクトに解析する最速の方法は?

誰かがこれをやる方法を知っていますか?

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を返す必要があります。

答えて

17

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; 
} 

についての考えを速度、私は私のアプリケーションでそれについて心配していない。 私のマシンでは1秒未満で50K回の反復が行われます。

+2

3つの関数例に対して50K回の反復がどれくらいかかったかを教えてください。そうすれば、「1秒未満」を視点に入れることができます。 – bzlm

+0

varマッチとdをconstキーワードに置き換えると、余分なパフォーマンスがあるのだろうか? – UnknownJoe

2

私はDate.Parse()がうまくいかないと思いますか?

+0

なし、それdoesntの! ! –

1

さて、次に方法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

これは、私はいくつかのあいた後に出てくる可能性が最速だった:

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)); 
} 

私は(約470ms castMethod2のために50kの反復を取得します)、私のバージョンでは300ミリ秒(63%の時間で同じ作業量)です。私は間違いなくあなたが日付の愚かな量を解析していない限り、両方が "十分に良い"と言うだろう。

私はUTCの日付文字列を解析するために、次のsnippletを使用していないしてきた
1

Date.parse()は、すべての可能なフォーマットを受け入れていないので、我々はformatStringのでたDateFormatterを使用して渡された日付ストリング値をプリフォーマットすることができますData.parseは、()ここで例えば

// 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

これらの2つの手順を実行する代わりに、['DateFormatter.parseDateString()'](http://help.adobe.com/jp/FlashPlatform/reference/actionscript/3/mx/formatters/DateFormatter.html#parseDateString %28%29)。 – approxiblue

0

は私の実装であり、理解できます。これを試してみてください。

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; 
} 
1
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); 
関連する問題