2008-08-06 13 views
19

Yyyy-aa-gg [ss: dd: ss] bir Date nesnesine ayrıştırmak için gerçekten hızlı bir yol bulmaya çalışıyorum. İşte bunu yapmaya çalıştığım 3 yol ve her yöntemin 50.000 tarih aralığı dizesini ayrıştırma zamanları.Actionscript 3 - yyyy-aa-gg'yi ayrıştırmanın en hızlı yolu ss: dd: bir Date nesnesine ss?

Bunu yapmanın daha hızlı yollarını veya yöntemleri hızlandırmak için ipuçları bilen var mı?

castMethod1 takes 3673 ms 
castMethod2 takes 3812 ms 
castMethod3 takes 3931 ms 

Kodu:

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]:" "))); 
} 

Hayır, Date.parse Kaldıramayacaksan tire varsayılan olarak. Ve "0000-00-00" gibi tarih saat dizeleri için null döndürmem gerekiyor.

cevap

17

Ben UTC tarih dizeleri ayrıştırmak için aşağıdaki snipplet kullanıyorum ettik:

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

Sadece zaman parçası kaldırmak ve ihtiyaçlarınız için sorunsuz çalışır:

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

Fikrim yok hakkında hız, benim uygulamalarımda bunun için endişelenmedim. 50K yineleme, makinemde bir saniyeden önemli ölçüde az. Date.parse() tüm olası biçimlerini kabul etmediğinden

+2

Lütfen 3 örnek işlev için 50 K yinelemenin ne kadar sürdüğünü bize söyleyin, böylece perspektiften "saniyeden daha az" koyabilirsiniz. – bzlm

+0

Var eşleşmeleri ve const anahtar sözcüğünü değiştirirseniz herhangi bir ekstra performans olacağını merak ediyorum. – UnknownJoe

2

Ben Date.Parse() çalışmıyor tahmin ediyorum?

+0

hayır öyle doesnt! ! –

1
Öyleyse yöntem 2 en iyi yolu görünüyor

:

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

Bu bazı işe yaramaz sonra ile gelebilir en hızlı: Ben castMethod2 için yaklaşık 470ms içinde 50k yinelemeleri olsun

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

() benim bilgisayarımda ve versiyonum için 300 ms (bu, zamanın% 63'ünde yapılan aynı miktarda iş). Kesinlikle aptalca miktarları ayrıştırmadıkça her ikisinin de "Yeterince İyi" olduğunu söyleyebilirim.

1

biz Data.parse() anlayabileceği biçemdizgesi ile DateFormatter kullanılarak geçirildiği dateString değerini, örneğin

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

Bu 2 adımı yerine, ['DateFormatter.parseDateString()'] işlevini kullanabiliriz (http://help.adobe.com/tr_TR/FlashPlatform/reference/actionscript/3/mx/formatters/DateFormatter.html#parseDateString % 28,% 29). – approxiblue

0
İşte

benim uygulamasıdır preformat edebilirsiniz. Bunu dene.

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); 
İlgili konular