Actionscript 3 - yyyy-mm-dd hh:mm:ss를 Date 객체로 구문 분석하는 가장 빠른 방법은 무엇입니까?

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

  •  08-06-2019
  •  | 
  •  

문제

나는 yyyy-mm-dd [hh:mm:ss]를 Date 객체로 구문 분석하는 정말 빠른 방법을 찾으려고 노력해 왔습니다.다음은 제가 시도한 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는 기본적으로 대시를 처리하지 않습니다.그리고 다음과 같은 날짜 시간 문자열에 대해서는 null을 반환해야 합니다. "0000-00-00".

도움이 되었습니까?

해결책

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

시간 부분을 제거하면 필요에 따라 제대로 작동합니다.

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

속도에 대해서는 전혀 모릅니다. 내 응용 프로그램에서는 속도에 대해 걱정하지 않았습니다. 내 컴퓨터에서는 1초도 안 되는 시간에 50,000번의 반복이 이루어졌습니다.

다른 팁

이것은 약간의 조작 끝에 내가 생각해 낼 수 있는 가장 빠른 것이었습니다.

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 동안 50,000번의 반복을 얻었고 내 버전에서는 300ms를 얻었습니다(63%의 시간에 수행된 작업량과 동일함).어리석은 양의 날짜를 분석하지 않는 한 둘 다 "충분하다"고 확실히 말하고 싶습니다.

Date.Parse()가 작동하지 않는 것 같아요?

그렇다면 방법 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 ));
}

Date.parse()는 가능한 모든 형식을 허용하지 않기 때문에 Data.parse()가 이해할 수 있는 formatString과 함께 DateFormatter를 사용하여 전달된 dateString 값의 형식을 미리 지정할 수 있습니다. 예:

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

여기 내 구현이 있습니다.한번 시도해 보세요.

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top