Actionscript 3 - самый быстрый способ разбора гггг-мм-дд чч: мм: сс к объекту Date?

голоса
20

Я пытался найти действительно быстрый способ синтаксического анализа гггг-мм-дд [чч: мм: сс] в объект Date. Вот 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.

Задан 06/08/2008 в 09:33
источник пользователем
На других языках...                            


7 ответов

голоса
17

Я использую следующий 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 итераций в значительно меньше , чем второй на моей машине.

Ответил 13/08/2008 в 17:21
источник пользователем

голоса
5

Это был самый быстрый я мог придумать после некоторого пустячный:

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

Я получаю 50k итераций в около 470ms для castMethod2 () на моем компьютере и 300 мс для моей версии (то же самое количество работы, проделанной в 63% времени). Я бы определенно сказать, оба «достаточно хорошо», если вы не разбор глупых количеств дат.

Ответил 13/08/2008 в 15:42
источник пользователем

голоса
2

Я предполагаю, что Date.parse () не работает?

Ответил 06/08/2008 в 09:50
источник пользователем

голоса
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);
Ответил 24/11/2013 в 02:24
источник пользователем

голоса
1

Поскольку Date.parse () не принимает все возможные форматы, мы можем предварительно отформатированные переданное значение DateString с помощью DateFormatter с FormatString что Data.parse () можно понять, например,

// 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));
Ответил 10/06/2010 в 17:06
источник пользователем

голоса
1

Ну тогда метод 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 ));
}
Ответил 06/08/2008 в 10:00
источник пользователем

голоса
0

Вот моя реализация. Дайте этому попытку.

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;
}
Ответил 07/08/2011 в 12:40
источник пользователем

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