Actionscript 3 - Der schnellste Weg yyyy-mm-dd hh zu analysieren: mm: ss zu einem Date-Objekt?

stimmen
20

Ich habe versucht, einen wirklich schnellen Weg zu finden, yyyy-mm-dd [hh: mm: ss] zu analysieren in ein Date-Objekt. Hier sind die 3 Möglichkeiten, wie ich versucht habe, es zu tun und die Zeiten, dauert es jede Methode 50.000 Datum Zeitangaben zu analysieren.

Kennt jemand ein schnelleren Wege diese oder Tipps zu tun, 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 wird keine Bindestriche standardmäßig behandeln. Und ich brauche für Datum Zeit Strings null zurück wie 0000-00-00.

Veröffentlicht am 06/08/2008 um 09:33
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
17

Ich habe die folgende snipplet wurde mit UTC-Datum Strings 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;
}

Nur die Zeit Teil entfernen, 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 über die Geschwindigkeit, habe ich nicht besorgt in meinen Anwendungen , die über. 50K Iterationen in deutlich weniger als eine Sekunde auf meinem Rechner.

Beantwortet am 13/08/2008 um 17:21
quelle vom benutzer

stimmen
5

Das war die schnellste, die ich mit nach einiger Fummelei kommen 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 50k Iterationen in etwa 470ms für castMethod2 () auf meinem Computer und 300 ms für meine Version (das ist die gleiche Menge an Arbeit in 63% der Zeit getan). Ich würde auf jeden Fall sagen beide „gut genug“ sind, es sei denn du dumme Mengen Daten sind Parsen.

Beantwortet am 13/08/2008 um 15:42
quelle vom benutzer

stimmen
2

Ich vermute, Date.parse () funktioniert nicht?

Beantwortet am 06/08/2008 um 09:50
quelle vom benutzer

stimmen
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);
Beantwortet am 24/11/2013 um 02:24
quelle vom benutzer

stimmen
1

Da Date.parse () nicht alle möglichen Formate annehmen, können wir vorformatieren können den übergebenen Wert mit datestring DateFormatter mit format dass Data.parse () verstehen, zB

// 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));
Beantwortet am 10/06/2010 um 17:06
quelle vom benutzer

stimmen
1

Na dann Methode 2 scheint der beste Weg:

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 ));
}
Beantwortet am 06/08/2008 um 10:00
quelle vom benutzer

stimmen
0

Hier ist meine Umsetzung. Geben Sie diesem einen Versuch.

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;
}
Beantwortet am 07/08/2011 um 12:40
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more