एक्शनस्क्रिप्ट 3 - yyyy-mm-dd hh को पार्स करने का सबसे तेज़ तरीका: मिमी: दिनांक वस्तु को एसएस?

मैं yyyy-mm-dd [hh: mm: ss] को किसी ऑब्जेक्ट में पार्स करने के लिए वास्तव में तेज़ तरीका खोजने का प्रयास कर रहा हूं। यहां 3 तरीके हैं जिन्हें मैंने करने की कोशिश की है और 50,000 दिनांक समय स्ट्रिंग को पार्स करने के लिए प्रत्येक विधि को कितनी बार लेता है।

क्या किसी को यह करने के तरीकों को तेज करने के सुझावों या सुझावों के बारे में कोई तेज़ तरीका पता है?

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

कोड:

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

नहीं, Date.parse डिफ़ॉल्ट रूप से डैश को संभाल नहीं पाएगा। और मुझे "0000-00-00" जैसे डेट टाइम स्ट्रिंग के लिए शून्य वापस करने की आवश्यकता है।

0
जोड़ा संपादित
विचारों: 4

7 उत्तर

मैं अनुमान लगा रहा हूँ तिथि। पर्स() काम नहीं करता है?

0
जोड़ा
नहीं यह नहीं करता! !
जोड़ा लेखक Marci-man, स्रोत

वैसे तो विधि 2 सबसे अच्छा तरीका लगता है:

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 ));
}
0
जोड़ा

मैं यूटीसी डेट स्ट्रिंग को पार्स करने के लिए निम्न स्निपलेट का उपयोग कर रहा हूं:

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

बस समय भाग को हटा दें और इसे अपनी आवश्यकताओं के लिए ठीक काम करना चाहिए:

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. 50K iterations in significantly less than a second on my machine.

0
जोड़ा
कृपया हमें बताएं कि 3 उदाहरण कार्यों के लिए कितने समय तक 50 के पुनरावृत्तियों ने लिया, इसलिए हम परिप्रेक्ष्य में "एक सेकंड से भी कम" डाल सकते हैं।
जोड़ा लेखक bzlm, स्रोत
मुझे आश्चर्य है कि यदि आप अलग-अलग मैचों और डी को कॉस्ट कीवर्ड के साथ बदलते हैं तो कोई अतिरिक्त प्रदर्शन होगा।
जोड़ा लेखक UnknownJoe, स्रोत

यह सबसे तेज था कि मैं कुछ झुकाव के बाद आ सकता था:

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

मुझे अपने कंप्यूटर पर castMethod2() के लिए लगभग 470ms में 50k पुनरावृत्तियों और मेरे संस्करण के लिए 300 एमएस मिलते हैं (यह उस समय का 63% समय में किया गया काम है)। मैं निश्चित रूप से कहूंगा कि दोनों "पर्याप्त अच्छे" हैं जब तक कि आप तारीखों की मूर्खतापूर्ण मात्रा का विश्लेषण नहीं कर रहे हों।

0
जोड़ा

क्योंकि Date.parse() सभी संभावित स्वरूपों को स्वीकार नहीं करता है, हम दिनांक तिथि के साथ डेटफॉर्मेटर का उपयोग कर बीत चुके दिनांक स्ट्रिंग मान को पूर्ववत कर सकते हैं। DataRparse() समझ सकते हैं, उदाहरण के लिए

// 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));
0
जोड़ा
इन 2 चरणों को करने के बजाय, हम DateFormatter.parseDateString()
जोड़ा लेखक approxiblue, स्रोत

मेरा कार्यान्वयन यहाँ है। इसे आज़माएं।

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;
}
0
जोड़ा
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);
0
जोड़ा