Friday 18 March 2011

Функция вывода разницы во времени

Часто на форумах встречается вопрос о реализации вывода разницы во времени в формате "количество дней, часов, минут и секунд".

При анализе логов возникает необходимость вычислить разность времени между двумя событиями. Данная функция существенно сокращает получение требуемого результата. Функция реализована на Perl (однако весьма просто расширить ее функциональность и портировать на другие языки программирования) и имеет следующие возможности:
  • 2 параметра timestamp или один параметр - их разница;
  • разумное вычисление больших промежутков (при разнице более недели нет необходимости вычислять точнее чем количество дней);
  • разумное вычисление больших промежутков (при разнице более года - вычисляется разница в годах, без дальнейшей детализации);
  • разумное форматирование малых промежутков (ноль дней и ноль часов по умолчанию удаляются);
  • вычисляется абсолютная величина;
sub timediff
{
    my $x = shift;
    $x -= shift if defined @_;
    $x = abs($x);

    # the more than one year
    return ">" . int($x / 31536000) if $x >= 31536000;
    # the more than one week
    return "~" . int($x / 86400) if $x >= 604800;

    my $d = sprintf "%d %02d:%02d:%02d", 
        int($x / 86400), 
        int($x / 3600) % 24, 
        int($x / 60) % 60, 
        $x % 60;

    $d =~ s/^0+ (00:)?// unless shift;

    return $d;
}
Далее - примеры использования:
print timediff(time);    # ">38" means "the more than 38 years"
print timediff(10000);   # "02:46:40"
print timediff(1000000); # "~11" means "about 11 days"
Ссылка на debugger.ru

No comments:

Post a Comment