2008-08-06 12 views
19

He estado tratando de encontrar una forma muy rápida de analizar aaaa-mm-dd [hh: mm: ss] en un objeto Date. Estas son las 3 formas en que he intentado hacerlo y las veces que le toma a cada método analizar 50,000 cadenas de tiempo.Actionscript 3 - Forma más rápida de analizar aaaa-mm-dd hh: mm: ss a un objeto Date?

¿Alguien sabe alguna forma más rápida de hacerlo o consejos para acelerar los métodos?

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

Código:

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

No, Date.parse no manejará guiones por defecto. Y necesito devolver nulo para cadenas de fecha y hora como "0000-00-00".

Respuesta

17

He estado usando el siguiente snipplet para analizar las cadenas de fecha 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; 
} 

Basta con retirar la pieza del tiempo y que debería funcionar bien para sus necesidades:

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

ni idea sobre la velocidad, no me ha preocupado eso en mis aplicaciones. 50K iteraciones en menos de un segundo en mi máquina.

+2

Por favor, díganos cuánto tiempo tomaron las iteraciones de 50K para las 3 funciones de ejemplo, por lo que podemos poner su "menos de un segundo" en perspectiva. – bzlm

+0

Me pregunto si habrá algún rendimiento adicional si reemplazas var matches yd con const keyword. – UnknownJoe

2

Supongo que Date.Parse() no funciona?

+0

no se duerma! ! –

1

Bueno, entonces el método 2 parece la mejor manera:

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

Este fue el más rápido que pude encontrar después de un trasteo:

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

consigo 50k iteraciones en aproximadamente 470ms para castMethod2 () en mi computadora y 300 ms para mi versión (esa es la misma cantidad de trabajo realizado en el 63% del tiempo). Definitivamente diría que ambos son "lo suficientemente buenos" a menos que esté analizando cantidades tontas de fechas.

1

Debido Date.parse() no acepta todos los formatos posibles, podemos preformat el valor DateString pasado usando DateFormatter con formatoCadena que Data.parse() puede comprender, por ejemplo

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

En lugar de realizar estos 2 pasos, podríamos usar ['DateFormatter.parseDateString()'] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/formatters/DateFormatter.html#parseDateString % 28% 29). – approxiblue

0

Aquí está mi aplicación. Dale una oportunidad.

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); 
Cuestiones relacionadas