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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
0
32 565
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я предполагаю, что 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 ));
}

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

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

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

Ответ принят как подходящий

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

Пожалуйста, сообщите нам, сколько времени потребовалось 50 000 итераций для 3 примеров функций, чтобы мы могли оценить ваше «меньше секунды».

bzlm 19.02.2009 12:33

Интересно, будет ли какая-то дополнительная производительность, если вы замените var match и d ключевым словом const.

UnknownJoe 28.12.2015 17:30

Поскольку 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));

Вместо выполнения этих двух шагов мы могли бы использовать DateFormatter.parseDateString().

approxiblue 17.10.2012 20:16

Вот моя реализация. Попробуйте.

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

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

Другие вопросы по теме