apache flex - Actionscript 3

Translate

Ich habe versucht, einen wirklich schnellen Weg zu finden, um JJJJ-MM-TT [HH: MM: SS] in ein Datumsobjekt zu analysieren. Hier sind die drei Möglichkeiten, wie ich es versucht habe, und die Zeiten, die jede Methode benötigt, um 50.000 Datums- und Zeitzeichenfolgen zu analysieren.

Kennt jemand schnellere Möglichkeiten oder Tipps zur Beschleunigung der Methoden?

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

Code:

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

Nein, Date.parse verarbeitet standardmäßig keine Bindestriche. Und ich muss null für Datums- und Uhrzeitzeichenfolgen wie zurückgeben"0000-00-00".

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ich habe das folgende Snipplet verwendet, um UTC-Datumszeichenfolgen zu analysieren:

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

Entfernen Sie einfach den Zeitteil und es sollte für Ihre Bedürfnisse gut funktionieren:

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

No idea about the speed, I haven't been worried about that in my applications. 50.000 Iterationen in deutlich weniger als einer Sekunde auf meinem Computer.

Quelle
Translate

Dies war die schnellste, die ich nach einigem Fummeln finden konnte:

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

Ich erhalte 50.000 Iterationen in ca. 470 ms für castMethod2 () auf meinem Computer und 300 ms für meine Version (das ist der gleiche Arbeitsaufwand in 63% der Fälle). Ich würde definitiv sagen, dass beide "gut genug" sind, es sei denn, Sie analysieren alberne Mengen von Daten.

Quelle
Translate

Ich vermute, Date.Parse () funktioniert nicht?

Quelle
Translate

Na dann scheint Methode 2 der beste Weg zu sein:

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

Da Date.parse () nicht alle möglichen Formate akzeptiert, können wir den übergebenen dateString-Wert mithilfe von DateFormatter mit formatString vorformatieren, das Data.parse () verstehen kann, z

// 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));
Quelle
Translate
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);
Quelle
Translate

Hier ist meine Implementierung. Probieren Sie es aus.

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