代码之家  ›  专栏  ›  技术社区  ›  Matt MacLean

actionscript 3-将yyyy-mm-dd hh:mm:ss解析为日期对象的最快方法?

  •  22
  • Matt MacLean  · 技术社区  · 16 年前

    我一直在尝试找到一种快速的方法来将yyyy-mm-dd[hh:mm:ss]解析为日期对象。下面是我尝试的3种方法,以及每个方法解析50000个日期时间字符串所需的时间。

    有人知道更快的方法吗?有人知道加快方法的技巧吗?

    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" .

    7 回复  |  直到 9 年前
        1
  •  17
  •   Theo    16 年前

    我一直在使用下面的snipplet分析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;
    }
    

    不知道速度,我在申请表中没有担心过。 在我的机器上,在不到一秒钟的时间内迭代50k次。

        2
  •  5
  •   grapefrukt    16 年前

    这是我在做了一些小动作后能想到的最快的方法:

    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次迭代,在我的版本中得到300ms次迭代(63%的时间内完成的工作量相同)。我肯定会说这两个都“足够好”,除非你在分析一些愚蠢的日期。

        3
  •  2
  •   GateKiller    16 年前

    我猜是日期。parse()不起作用?

        4
  •  1
  •   GateKiller    16 年前

    那么方法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 ));
    }
    
        5
  •  1
  •   JabbyPanda    14 年前

    因为date.parse()不接受所有可能的格式,所以我们可以使用dateformater和data.parse()可以理解的格式字符串来执行传递的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));
    
        6
  •  1
  •   Romeo    11 年前
    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);
    
        7
  •  0
  •   Andro Selva Anand Wadhwani    12 年前

    这是我的实现。试试看。

    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;
    }
    
    推荐文章