Actionscript 3 – Der schnellste Weg, jjjj-mm-tt hh:mm:ss in ein Datumsobjekt zu analysieren?

StackOverflow https://stackoverflow.com/questions/3163

  •  08-06-2019
  •  | 
  •  

Frage

Ich habe versucht, eine wirklich schnelle Möglichkeit zu finden, yyyy-mm-dd [hh:mm:ss] in ein Date-Objekt zu analysieren.Hier sind die drei Möglichkeiten, die ich ausprobiert habe, und die Zeit, die jede Methode benötigt, um 50.000 Datums-/Uhrzeitzeichenfolgen zu analysieren.

Kennt jemand schnellere Möglichkeiten oder Tipps, um die Methoden zu beschleunigen?

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 Bindestriche standardmäßig nicht.Und ich muss für Datums- und Uhrzeitzeichenfolgen wie null zurückgeben "0000-00-00".

War es hilfreich?

Lösung

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

Keine Ahnung von der Geschwindigkeit, darüber habe ich mir bei meinen Bewerbungen keine Sorgen gemacht. 50.000 Iterationen in deutlich weniger als einer Sekunde auf meinem Rechner.

Andere Tipps

Dies war das schnellste, was mir nach einigem Herumfummeln einfiel:

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 etwa 470 ms für castMethod2() auf meinem Computer und 300 ms für meine Version (das ist der gleiche Arbeitsaufwand, der in 63 % der Zeit erledigt wird).Ich würde auf jeden Fall sagen, dass beide „gut genug“ sind, es sei denn, Sie analysieren dumme Mengen an Daten.

Ich vermute, Date.Parse() funktioniert nicht?

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

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

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

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top